merge from trunk
120
Changelog.yaml
@ -4,6 +4,126 @@
|
|||||||
# for important features/bug fixes.
|
# for important features/bug fixes.
|
||||||
# Also, each release can have new and improved recipes.
|
# Also, each release can have new and improved recipes.
|
||||||
|
|
||||||
|
- version: 0.7.34
|
||||||
|
date: 2010-12-17
|
||||||
|
|
||||||
|
new features:
|
||||||
|
- title: "Page turn animations in the e-book viewer"
|
||||||
|
type: major
|
||||||
|
description: >
|
||||||
|
"Now when you use the Page Down/Page Up keys or the next/previous page buttons in the viewer, page turning will be animated. The duration of the animation can be controlled in the viewer preferences. Setting it to 0 disables the animation completely."
|
||||||
|
|
||||||
|
- title: "Conversion pipeline: Add an option to set the minimum line height of all elemnts as a percentage of the computed font size. By default, calibre now sets the line height to 120% of the computed font size."
|
||||||
|
|
||||||
|
- title: "Large speedup in startup times and post metadata edit wait for large libraries"
|
||||||
|
|
||||||
|
- title: "Allow changing the font used in the calibre interface via Preferences->Look and feel"
|
||||||
|
|
||||||
|
- title: "Allow editing of the title sort value for a book via the edit metadata dialog"
|
||||||
|
|
||||||
|
- title: "Disable the cover cache. This means that if you are running calibre on an underpowered machine, you might notice some slow down in the cover browser. On the other hand, calibre's memory consumption is reduced."
|
||||||
|
|
||||||
|
- title: "You can now restart calibre in debug mode by clicking the arrow next to the Preferences button. In debug mode, after you quit calibre, a diagnostic log will popup"
|
||||||
|
tickets: [7359]
|
||||||
|
|
||||||
|
- title: "When creating a new calibre library add an option to copy the custom column, saved searches, etc from the current library."
|
||||||
|
tickets: [7643]
|
||||||
|
|
||||||
|
- title: "Add more tweaks to control how the next available series number is calculated."
|
||||||
|
tickets: [7892]
|
||||||
|
|
||||||
|
- title: "Add a tweak to control layout of the custom metadata tab in the edit metadata dialog"
|
||||||
|
|
||||||
|
- title: "Apple driver: Set series number as track number on windows when sending books to iTunes"
|
||||||
|
|
||||||
|
- title: "Drivers for PocketBook 701 and Samsung E65"
|
||||||
|
|
||||||
|
- title: "E-book viewer: Add option to have the mouse wheel flip pages"
|
||||||
|
|
||||||
|
- title: "Add a load_resources method to the InterfaceAction and Plugin classes to facilitate loading of resources from plugin ZIP files"
|
||||||
|
|
||||||
|
- title: "E-book viewer: Add option to not remember position in book when quitting."
|
||||||
|
tickets: [7699]
|
||||||
|
|
||||||
|
- title: "When sorting the book list, keep the current book visible after the sort completes."
|
||||||
|
tickets: [7504]
|
||||||
|
|
||||||
|
- title: "EPUB Output: Add an option to flatten the EPUB file structure, specially for FBReaderJ."
|
||||||
|
tickets: [7788]
|
||||||
|
|
||||||
|
- title: "EPUB Output: Ensure all files inside the generated EPUB have unique filenames, to support broken EPUB readers like Stanza, Aldiko, FBReader and Sigil"
|
||||||
|
|
||||||
|
- title: "FB2 Output: Add support for some 2.1 style tags."
|
||||||
|
|
||||||
|
- title: "Bulk metadata edit: Add options to delete cover/generate default cover."
|
||||||
|
tickets: [7885]
|
||||||
|
|
||||||
|
- title: "Fix a regression in 0.7.33 that broke updating covers in ebook files when saving to disk."
|
||||||
|
tickets: [7886]
|
||||||
|
|
||||||
|
- title: "Don't refresh the Tag browser if it is hidden. Speeds up metadata editing with large libraries, if you hide teh Tag Browser."
|
||||||
|
|
||||||
|
- title: "MOBI Output: Add option to ignore margins in input document"
|
||||||
|
tickets: [7877]
|
||||||
|
|
||||||
|
- title: "Kobo driver: Add support for 1.8.x firmware"
|
||||||
|
|
||||||
|
bug fixes:
|
||||||
|
- title: "Fix various memory leaks introduced in the last couple of releases"
|
||||||
|
|
||||||
|
- title: "EPUB metadata: When rendering first page as the cover, handle embedded svg correctly."
|
||||||
|
tickets: [7909]
|
||||||
|
|
||||||
|
- title: "Disable multiple library support when the CALIBRE_OVERRIDE_DATABASE_PATH env var is set"
|
||||||
|
|
||||||
|
- title: "Content server: Fix bug that could cause saved search based restrictions to not exclude all books"
|
||||||
|
tickets: [7876]
|
||||||
|
|
||||||
|
- title: "Topaz metadata: Read metadata correctly from Topaz files that have MOBI file extensions"
|
||||||
|
|
||||||
|
- title: "MOBI Input: Handle the (rare) MOBI files that do not specify per paragraph text indents correctly."
|
||||||
|
tickets: [7869]
|
||||||
|
|
||||||
|
- title: "MOBI metadata reader: Handle invalid PRC files with spurious image_offset headers"
|
||||||
|
|
||||||
|
- title: "Fix drag/drop of new cover to book detail panel does not update cover browser"
|
||||||
|
tickets: [7890]
|
||||||
|
|
||||||
|
- title: "Do not open the book details dialog when double click on the scrollbars in the book details panel"
|
||||||
|
tickets: [7826]
|
||||||
|
|
||||||
|
- title: "Templates: Fix {tags} not working when no tags are present"
|
||||||
|
tickets: [7888]
|
||||||
|
|
||||||
|
- title: "HTML metadata: Fix regression that broke parsing of some meta tags"
|
||||||
|
tickets: [7851]
|
||||||
|
|
||||||
|
- title: "Preferences: Add tooltips to buddy labels as well."
|
||||||
|
tickets: [7873]
|
||||||
|
|
||||||
|
- title: "Content server: Fix handling of root URL when using --url-prefix"
|
||||||
|
|
||||||
|
- title: "Ensure that the default encoding used by python is never ASCII (needed when running a non frozen version of calibre on linux)"
|
||||||
|
|
||||||
|
improved recipes:
|
||||||
|
- Astronomy Picture of the day
|
||||||
|
- New Scientist
|
||||||
|
- Radikal
|
||||||
|
- Times of India
|
||||||
|
- Economic Times
|
||||||
|
- Zeit Online
|
||||||
|
- Dilbert
|
||||||
|
|
||||||
|
new recipes:
|
||||||
|
- title: "Various Japanes news sources, National Geographic and paper.li"
|
||||||
|
author: "Hiroshi Miura"
|
||||||
|
|
||||||
|
- title: "Science based medicine"
|
||||||
|
author: "BuzzKill"
|
||||||
|
|
||||||
|
- title: "Kompiutierra"
|
||||||
|
author: "Vadim Dyadkin"
|
||||||
|
|
||||||
- version: 0.7.33
|
- version: 0.7.33
|
||||||
date: 2010-12-10
|
date: 2010-12-10
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 133 KiB |
831
imgsrc/edit-cut.svg
Normal file
@ -0,0 +1,831 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://web.resource.org/cc/"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="128"
|
||||||
|
height="128"
|
||||||
|
id="svg2"
|
||||||
|
sodipodi:version="0.32"
|
||||||
|
inkscape:version="0.45.1"
|
||||||
|
version="1.0"
|
||||||
|
sodipodi:docbase="/home/david/Oxygen/trunk/scalable/actions"
|
||||||
|
sodipodi:docname="edit-cut.svgz"
|
||||||
|
inkscape:output_extension="org.inkscape.output.svgz.inkscape"
|
||||||
|
inkscape:export-filename="edit-cut.png"
|
||||||
|
inkscape:export-xdpi="22.5"
|
||||||
|
inkscape:export-ydpi="22.5">
|
||||||
|
<defs
|
||||||
|
id="defs4">
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient4792">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#000000;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4794" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#000000;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4796" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient4758">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4760" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4762" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient4722">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#dfdfdf;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop4724" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#606060;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop4726" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient4635">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4637" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4639" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient4618">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4620" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4622" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient4488">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4490" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4492" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient4445">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#606060;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop4447" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#343434;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop4449" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient4253">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#000000;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4255" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#000000;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4257" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3792"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
id="stop3794"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
id="stop3796"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#e7e7e7;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient3631">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#000000;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop3633" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#000000;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop3635" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient3475">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#eeeeee;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop3477" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#cbcbcb;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop3479" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient3467">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#e8e8e8;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop3469" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#888888;stop-opacity:0.53714287"
|
||||||
|
offset="1"
|
||||||
|
id="stop3471" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient3176"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
id="stop3178"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#323232;stop-opacity:1;" />
|
||||||
|
<stop
|
||||||
|
id="stop3180"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#000000;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3516"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.315637,39.880442)"
|
||||||
|
x1="63.245899"
|
||||||
|
y1="107.23933"
|
||||||
|
x2="58.32019"
|
||||||
|
y2="107.5107" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3518"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.315636,39.008928)"
|
||||||
|
x1="69.501228"
|
||||||
|
y1="109.56824"
|
||||||
|
x2="56.484062"
|
||||||
|
y2="117.84955" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3520"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(-0.5000017,0.8660252)"
|
||||||
|
x1="63.245899"
|
||||||
|
y1="107.23933"
|
||||||
|
x2="58.32019"
|
||||||
|
y2="107.5107" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3522"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="69.501228"
|
||||||
|
y1="109.56824"
|
||||||
|
x2="56.484062"
|
||||||
|
y2="117.84955" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3475"
|
||||||
|
id="linearGradient3524"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="62.646275"
|
||||||
|
y1="53.750923"
|
||||||
|
x2="52.066586"
|
||||||
|
y2="53.750923" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3526"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(-0.5000017,0.8660252)"
|
||||||
|
x1="63.245899"
|
||||||
|
y1="107.23933"
|
||||||
|
x2="58.32019"
|
||||||
|
y2="107.5107" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3467"
|
||||||
|
id="linearGradient3530"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="63.553711"
|
||||||
|
y1="16.056862"
|
||||||
|
x2="63.553711"
|
||||||
|
y2="63.136379" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3467"
|
||||||
|
id="linearGradient3609"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="63.553711"
|
||||||
|
y1="16.056862"
|
||||||
|
x2="63.553711"
|
||||||
|
y2="63.136379"
|
||||||
|
gradientTransform="matrix(0.8715135,3.655296e-8,-3.655296e-8,0.8715135,8.2476912,8.4795979)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3614"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.315637,39.880442)"
|
||||||
|
x1="63.245899"
|
||||||
|
y1="107.23933"
|
||||||
|
x2="58.32019"
|
||||||
|
y2="107.5107" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3792"
|
||||||
|
id="linearGradient3617"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="62.646275"
|
||||||
|
y1="53.750923"
|
||||||
|
x2="52.066586"
|
||||||
|
y2="53.750923"
|
||||||
|
gradientTransform="matrix(0.8513047,-0.4911732,0.4915009,0.850737,-22.138279,32.363934)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3625"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.315637,39.880442)"
|
||||||
|
x1="63.245899"
|
||||||
|
y1="107.23933"
|
||||||
|
x2="58.32019"
|
||||||
|
y2="107.5107" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3627"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.315636,39.008928)"
|
||||||
|
x1="69.501228"
|
||||||
|
y1="109.56824"
|
||||||
|
x2="56.484062"
|
||||||
|
y2="117.84955" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3631"
|
||||||
|
id="linearGradient3637"
|
||||||
|
x1="61.911907"
|
||||||
|
y1="72.456772"
|
||||||
|
x2="59.719414"
|
||||||
|
y2="73.709625"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.8541426,0,0,1.8529064,-52.138638,-62.025773)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3631"
|
||||||
|
id="linearGradient3641"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-5.0049887,0.680543,-0.6885831,-4.9465506,418.08891,395.15615)"
|
||||||
|
x1="61.911907"
|
||||||
|
y1="72.456772"
|
||||||
|
x2="59.719414"
|
||||||
|
y2="73.709625" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3467"
|
||||||
|
id="linearGradient3644"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="63.553711"
|
||||||
|
y1="16.056862"
|
||||||
|
x2="63.553711"
|
||||||
|
y2="63.136379"
|
||||||
|
gradientTransform="matrix(-0.8715135,3.655296e-8,3.655296e-8,0.8715135,120.39367,8.4795979)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3649"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.7547529,-0.4357568,-0.4357568,0.7547529,140.957,39.880442)"
|
||||||
|
x1="63.245899"
|
||||||
|
y1="107.23933"
|
||||||
|
x2="58.32019"
|
||||||
|
y2="107.5107" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3475"
|
||||||
|
id="linearGradient3652"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="62.646275"
|
||||||
|
y1="53.750923"
|
||||||
|
x2="52.066586"
|
||||||
|
y2="53.750923"
|
||||||
|
gradientTransform="matrix(-0.7547529,-0.4357568,-0.4357568,0.7547529,140.957,39.008928)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3655"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.7547529,-0.4357568,-0.4357568,0.7547529,140.957,38.380442)"
|
||||||
|
x1="63.245899"
|
||||||
|
y1="107.23933"
|
||||||
|
x2="58.32019"
|
||||||
|
y2="107.5107" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3657"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="69.501228"
|
||||||
|
y1="109.56824"
|
||||||
|
x2="56.484062"
|
||||||
|
y2="117.84955"
|
||||||
|
gradientTransform="matrix(-0.7547529,-0.4357568,-0.4357568,0.7547529,140.957,37.508928)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3669"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.315637,39.880442)"
|
||||||
|
x1="63.245899"
|
||||||
|
y1="107.23933"
|
||||||
|
x2="58.32019"
|
||||||
|
y2="107.5107" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3671"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.315636,39.008928)"
|
||||||
|
x1="69.501228"
|
||||||
|
y1="109.56824"
|
||||||
|
x2="56.484062"
|
||||||
|
y2="117.84955" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3792"
|
||||||
|
id="linearGradient3802"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.8513047,-0.4911732,-0.4915009,0.850737,150.74175,32.363934)"
|
||||||
|
x1="62.646275"
|
||||||
|
y1="53.750923"
|
||||||
|
x2="52.066586"
|
||||||
|
y2="53.750923" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3838"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.7547529,-0.4357568,-0.4357568,0.7547529,140.957,40.880442)"
|
||||||
|
x1="63.245899"
|
||||||
|
y1="107.23933"
|
||||||
|
x2="58.32019"
|
||||||
|
y2="107.5107" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3847"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.013047,38.380442)"
|
||||||
|
x1="63.245899"
|
||||||
|
y1="107.23933"
|
||||||
|
x2="58.32019"
|
||||||
|
y2="107.5107" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3849"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.013047,37.508928)"
|
||||||
|
x1="69.501228"
|
||||||
|
y1="109.56824"
|
||||||
|
x2="56.484062"
|
||||||
|
y2="117.84955" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3881"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.7547529,-0.4357568,-0.4357568,0.7547529,140.957,37.508928)"
|
||||||
|
x1="69.501228"
|
||||||
|
y1="109.56824"
|
||||||
|
x2="56.484062"
|
||||||
|
y2="117.84955" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient3887"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.7547529,-0.4357568,0.4357568,0.7547529,-12.013047,37.508928)"
|
||||||
|
x1="69.501228"
|
||||||
|
y1="109.56824"
|
||||||
|
x2="56.484062"
|
||||||
|
y2="117.84955" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient4006"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.8513047,-0.4911732,-0.4915009,0.850737,150.74175,33.346282)"
|
||||||
|
x1="63.245899"
|
||||||
|
y1="107.23933"
|
||||||
|
x2="58.32019"
|
||||||
|
y2="107.5107" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient4085"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.8513047,-0.4911732,-0.4915009,0.850737,149.24175,36.346282)"
|
||||||
|
x1="63.245899"
|
||||||
|
y1="107.23933"
|
||||||
|
x2="58.32019"
|
||||||
|
y2="107.5107" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3176"
|
||||||
|
id="linearGradient4087"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.8513047,-0.4911732,-0.4915009,0.850737,150.74175,33.346282)"
|
||||||
|
x1="63.245899"
|
||||||
|
y1="107.23933"
|
||||||
|
x2="58.32019"
|
||||||
|
y2="107.5107" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3792"
|
||||||
|
id="linearGradient4250"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.8513047,-0.4911732,-0.4915009,0.850737,150.74175,32.363934)"
|
||||||
|
x1="62.646275"
|
||||||
|
y1="53.750923"
|
||||||
|
x2="52.066586"
|
||||||
|
y2="53.750923" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4253"
|
||||||
|
id="linearGradient4259"
|
||||||
|
x1="65.414917"
|
||||||
|
y1="63.2187"
|
||||||
|
x2="71.566734"
|
||||||
|
y2="58.624897"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4445"
|
||||||
|
id="linearGradient4443"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.8513046,-0.4911732,0.4915009,0.850737,-21.796979,30.673174)"
|
||||||
|
x1="66.410789"
|
||||||
|
y1="111.09748"
|
||||||
|
x2="56.771309"
|
||||||
|
y2="111.40427" />
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath4455">
|
||||||
|
<path
|
||||||
|
style="fill:#343434;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 75.1875,70.0625 C 74.330819,70.112586 73.601545,70.703549 73.375,71.53125 L 71.21875,79.59375 C 71.09204,80.103085 71.170605,80.641816 71.4375,81.09375 L 89.625,112.5625 C 91.972816,116.62633 95.167933,119.72417 98.625,121.46875 C 102.08207,123.21333 105.97364,123.61751 109.15625,121.78125 C 112.33881,119.94502 113.935,116.36699 114.15625,112.5 C 114.3775,108.63301 113.28602,104.31505 110.9375,100.25 C 108.5891,96.185153 105.39577,93.080216 101.9375,91.34375 C 98.479225,89.607284 94.586162,89.2278 91.40625,91.0625 C 90.654039,91.496499 90.578013,91.480641 90,91.1875 C 89.421987,90.894359 88.429852,89.981353 87.25,88.34375 C 84.890296,85.068543 81.724299,79.185679 77.03125,71.0625 C 76.654739,70.40782 75.941586,70.021025 75.1875,70.0625 z M 97.9375,99.03125 C 99.847583,98.899901 103.29363,100.88292 105.4375,104.59375 C 106.75724,106.8781 107.33023,109.26773 107.25,111.125 C 107.16977,112.98227 106.50165,114.13243 105.59375,114.65625 C 104.68591,115.18004 103.39934,115.17251 101.75,114.3125 C 100.10066,113.45249 98.288767,111.75356 96.96875,109.46875 C 95.649001,107.18439 95.076021,104.76352 95.15625,102.90625 C 95.236479,101.04898 95.873353,99.898826 96.78125,99.375 C 97.154526,99.159631 97.520851,99.0599 97.9375,99.03125 z "
|
||||||
|
id="path4457"
|
||||||
|
sodipodi:nodetypes="cccccsssssssscccsssssssc" />
|
||||||
|
</clipPath>
|
||||||
|
<filter
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="filter4475">
|
||||||
|
<feGaussianBlur
|
||||||
|
inkscape:collect="always"
|
||||||
|
stdDeviation="0.47498194"
|
||||||
|
id="feGaussianBlur4477" />
|
||||||
|
</filter>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4488"
|
||||||
|
id="linearGradient4494"
|
||||||
|
x1="100.23751"
|
||||||
|
y1="84.952927"
|
||||||
|
x2="115.33315"
|
||||||
|
y2="111.09933"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.1304268,0,0,1.1304268,-12.155804,-11.996273)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4445"
|
||||||
|
id="linearGradient4572"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.8513046,-0.4911732,-0.4915009,0.850737,150.64081,30.673174)"
|
||||||
|
x1="66.410789"
|
||||||
|
y1="111.09748"
|
||||||
|
x2="56.771309"
|
||||||
|
y2="111.40427" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4488"
|
||||||
|
id="linearGradient4574"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-1.1304268,0,0,1.1304268,140.99964,-11.996273)"
|
||||||
|
x1="100.23751"
|
||||||
|
y1="84.952927"
|
||||||
|
x2="115.33315"
|
||||||
|
y2="111.09933" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4618"
|
||||||
|
id="linearGradient4624"
|
||||||
|
x1="39.66201"
|
||||||
|
y1="99.394554"
|
||||||
|
x2="32.5625"
|
||||||
|
y2="108.58216"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.7874752,0.1143529,-0.1388531,-0.6485276,62.315135,175.57221)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4445"
|
||||||
|
id="linearGradient4630"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.8513046,-0.4911732,-0.4915009,0.850737,150.14081,34.173174)"
|
||||||
|
x1="66.410789"
|
||||||
|
y1="111.09748"
|
||||||
|
x2="56.771309"
|
||||||
|
y2="111.40427" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4445"
|
||||||
|
id="linearGradient4632"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(-0.8513046,-0.4911732,-0.4915009,0.850737,150.64081,30.673174)"
|
||||||
|
x1="66.410789"
|
||||||
|
y1="111.09748"
|
||||||
|
x2="56.771309"
|
||||||
|
y2="111.40427" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4635"
|
||||||
|
id="linearGradient4641"
|
||||||
|
x1="24.636236"
|
||||||
|
y1="118.53715"
|
||||||
|
x2="24.636236"
|
||||||
|
y2="110.80067"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<filter
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="filter4691">
|
||||||
|
<feGaussianBlur
|
||||||
|
inkscape:collect="always"
|
||||||
|
stdDeviation="0.41898454"
|
||||||
|
id="feGaussianBlur4693" />
|
||||||
|
</filter>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4635"
|
||||||
|
id="linearGradient4701"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="24.636236"
|
||||||
|
y1="118.53715"
|
||||||
|
x2="24.636236"
|
||||||
|
y2="110.80067" />
|
||||||
|
<filter
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="filter4711">
|
||||||
|
<feGaussianBlur
|
||||||
|
inkscape:collect="always"
|
||||||
|
stdDeviation="0.71627592"
|
||||||
|
id="feGaussianBlur4713" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="filter4715">
|
||||||
|
<feGaussianBlur
|
||||||
|
inkscape:collect="always"
|
||||||
|
stdDeviation="0.71627592"
|
||||||
|
id="feGaussianBlur4717" />
|
||||||
|
</filter>
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4722"
|
||||||
|
id="radialGradient4728"
|
||||||
|
cx="66"
|
||||||
|
cy="54"
|
||||||
|
fx="66.495979"
|
||||||
|
fy="53.140942"
|
||||||
|
r="2"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.0315502,-0.5959631,0.5955656,1.0308618,-34.242853,37.667027)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4758"
|
||||||
|
id="linearGradient4764"
|
||||||
|
x1="51.619904"
|
||||||
|
y1="81.644371"
|
||||||
|
x2="46.564438"
|
||||||
|
y2="99.975533"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(3.132137,-2.5057096)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4792"
|
||||||
|
id="linearGradient4798"
|
||||||
|
x1="64.46875"
|
||||||
|
y1="67.044975"
|
||||||
|
x2="65.410522"
|
||||||
|
y2="80.970673"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<filter
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="filter4821">
|
||||||
|
<feGaussianBlur
|
||||||
|
inkscape:collect="always"
|
||||||
|
stdDeviation="0.98653907"
|
||||||
|
id="feGaussianBlur4823" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
gridtolerance="10000"
|
||||||
|
guidetolerance="10"
|
||||||
|
objecttolerance="10"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="4.7890625"
|
||||||
|
inkscape:cx="64"
|
||||||
|
inkscape:cy="64"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g3690"
|
||||||
|
width="128px"
|
||||||
|
height="128px"
|
||||||
|
showgrid="false"
|
||||||
|
gridspacingx="2px"
|
||||||
|
gridspacingy="2px"
|
||||||
|
gridempspacing="4"
|
||||||
|
inkscape:grid-points="true"
|
||||||
|
showborder="false"
|
||||||
|
borderlayer="false"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:window-width="794"
|
||||||
|
inkscape:window-height="730"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0" />
|
||||||
|
<metadata
|
||||||
|
id="metadata7">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<g
|
||||||
|
id="g3690">
|
||||||
|
<path
|
||||||
|
style="opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4798);stroke-width:3.54751818;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4821)"
|
||||||
|
d="M 35.28125,14.46875 C 34.326418,15.020173 34.451101,16.184543 34.6875,16.78125 C 41.824923,35.39161 48.223262,52.347787 58.15625,70.75 L 56.625,73.21875 C 56.244936,72.547795 55.487111,72.144016 54.6875,72.21875 C 54.034234,72.275803 53.450423,72.649442 53.125,73.21875 C 48.962268,80.428813 46.167367,85.651204 44.09375,88.53125 C 43.056941,89.971273 42.203917,90.769641 41.75,91 C 41.296083,91.230359 41.306883,91.263851 40.6875,90.90625 C 37.787275,89.231804 34.269689,89.591888 31.15625,91.15625 C 28.042811,92.720612 25.164593,95.484072 23.0625,99.125 C 20.960291,102.76613 19.988354,106.64212 20.1875,110.125 C 20.386646,113.60788 21.847132,116.85528 24.75,118.53125 C 27.652918,120.20725 31.200269,119.82161 34.3125,118.25 C 37.424731,116.67839 40.273497,113.92116 42.375,110.28125 L 58.5,82.34375 C 58.674659,82.047999 58.772646,81.71253 58.78125,81.375 C 60.494006,80.173524 62.436255,79.043092 64.3125,78.25 C 66.301575,79.090643 68.394793,80.309785 70.1875,81.59375 C 70.216655,81.858831 70.304417,82.106865 70.4375,82.34375 L 86.5625,110.28125 C 88.664002,113.92116 91.544019,116.67839 94.65625,118.25 C 97.768481,119.82161 101.28458,120.20725 104.1875,118.53125 C 107.09037,116.85528 108.55085,113.60788 108.75,110.125 C 108.94915,106.64212 107.97721,102.76613 105.875,99.125 C 103.77291,95.484072 100.89469,92.720612 97.78125,91.15625 C 94.667811,89.591888 91.150225,89.231804 88.25,90.90625 C 87.630617,91.263851 87.641417,91.230359 87.1875,91 C 86.733583,90.769641 85.880559,89.971273 84.84375,88.53125 C 82.770133,85.651204 79.975232,80.428813 75.8125,73.21875 C 75.435989,72.56407 74.722836,72.177275 73.96875,72.21875 C 73.178739,72.268279 72.494718,72.772672 72.21875,73.5 L 70.5,70.75 C 80.43299,52.347791 86.83133,35.391608 93.96875,16.78125 C 94.205146,16.184543 94.329835,15.020174 93.375,14.46875 L 64.3125,60.875 L 35.28125,14.46875 z M 34.78125,98.375 C 35.1163,98.398055 35.384215,98.481147 35.6875,98.65625 C 36.408735,99.072656 36.962348,100.02888 37.03125,101.625 C 37.100152,103.22112 36.619402,105.28826 35.46875,107.28125 C 34.317829,109.27471 32.759661,110.76121 31.34375,111.5 C 29.927839,112.23879 28.846185,112.22887 28.125,111.8125 C 27.40377,111.3961 26.850153,110.47112 26.78125,108.875 C 26.712347,107.27888 27.193102,105.18048 28.34375,103.1875 C 30.21285,99.950123 33.224696,98.267893 34.78125,98.375 z M 94.15625,98.375 C 95.712802,98.267893 98.724654,99.950125 100.59375,103.1875 C 101.7444,105.18048 102.22515,107.27888 102.15625,108.875 C 102.08735,110.47112 101.56498,111.3961 100.84375,111.8125 C 100.12257,112.22887 99.04091,112.23879 97.625,111.5 C 96.20909,110.76121 94.650922,109.27471 93.5,107.28125 C 92.349349,105.28826 91.837348,103.22112 91.90625,101.625 C 91.975152,100.02888 92.528765,99.072656 93.25,98.65625 C 93.553281,98.48115 93.8212,98.398055 94.15625,98.375 z "
|
||||||
|
id="path3483"
|
||||||
|
transform="matrix(1.1279249,0,0,1.1271729,-8.2471649,-11.605871)" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccsssssssscccsssssssc"
|
||||||
|
id="path4566"
|
||||||
|
d="M 53.65633,70.0625 C 54.51301,70.112586 55.24229,70.703549 55.46883,71.53125 L 57.62508,79.59375 C 57.75179,80.103085 57.67323,80.641816 57.40633,81.09375 L 39.218832,112.5625 C 36.871016,116.62633 33.675899,119.72417 30.218832,121.46875 C 26.761762,123.21333 22.870192,123.61751 19.687582,121.78125 C 16.505022,119.94502 14.908832,116.36699 14.687582,112.5 C 14.466332,108.63301 15.557812,104.31505 17.906332,100.25 C 20.254732,96.185153 23.448062,93.080216 26.906332,91.34375 C 30.364607,89.607284 34.25767,89.2278 37.437582,91.0625 C 38.189793,91.496499 38.265819,91.480641 38.843832,91.1875 C 39.421845,90.894359 40.41398,89.981353 41.593832,88.34375 C 43.95354,85.068543 47.11953,79.185679 51.81258,71.0625 C 52.18909,70.40782 52.90225,70.021025 53.65633,70.0625 z M 30.906332,99.03125 C 28.996249,98.899901 25.550202,100.88292 23.406332,104.59375 C 22.086592,106.8781 21.513602,109.26773 21.593832,111.125 C 21.674062,112.98227 22.342182,114.13243 23.250082,114.65625 C 24.157922,115.18004 25.444492,115.17251 27.093832,114.3125 C 28.743172,113.45249 30.555065,111.75356 31.875082,109.46875 C 33.194831,107.18439 33.767811,104.76352 33.687582,102.90625 C 33.607353,101.04898 32.970479,99.898826 32.062582,99.375 C 31.689306,99.159631 31.322981,99.0599 30.906332,99.03125 z "
|
||||||
|
style="fill:url(#linearGradient4572);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccscssssccsssscc"
|
||||||
|
id="path4568"
|
||||||
|
d="M 55.65241,70.312928 C 56.57508,70.366873 57.35134,71.011135 57.59533,71.902591 L 57.66599,72.185197 C 57.29393,71.760421 56.80725,71.477828 56.21763,71.443355 C 55.40545,71.398686 54.60957,71.798027 54.20405,72.50313 C 49.14952,81.252005 45.75918,87.592357 43.217718,91.119846 C 41.946986,92.883587 40.872884,93.877473 40.250348,94.193194 C 39.627813,94.508912 39.541489,94.519318 38.731337,94.051891 C 35.306492,92.075871 31.1164,92.499608 27.391742,94.369823 C 23.667082,96.240042 20.241732,99.5652 17.712462,103.94313 L 17.147252,102.8127 C 19.676522,98.434769 23.101862,95.109615 26.826532,93.239397 C 30.551186,91.369181 34.741278,90.945444 38.166123,92.921464 C 38.976275,93.388891 39.062599,93.378485 39.685134,93.062767 C 40.307671,92.747046 41.381773,91.75316 42.652505,89.989419 C 45.19396,86.461931 48.58431,80.121578 53.63884,71.372703 C 54.04436,70.667601 54.84024,70.268259 55.65241,70.312928 z "
|
||||||
|
style="opacity:0.77227723;fill:url(#linearGradient4574);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
clip-path="url(#clipPath4455)"
|
||||||
|
style="opacity:0.70297032;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4475)"
|
||||||
|
d="M 75.1875,70.0625 C 74.330819,70.112586 73.601545,70.703549 73.375,71.53125 L 71.21875,79.59375 C 71.09204,80.103085 71.170605,80.641816 71.4375,81.09375 L 89.625,112.5625 C 91.972816,116.62633 95.167933,119.72417 98.625,121.46875 C 102.08207,123.21333 105.97364,123.61751 109.15625,121.78125 C 112.33881,119.94502 113.935,116.36699 114.15625,112.5 C 114.3775,108.63301 113.28602,104.31505 110.9375,100.25 C 108.5891,96.185153 105.39577,93.080216 101.9375,91.34375 C 98.479225,89.607284 94.586162,89.2278 91.40625,91.0625 C 90.654039,91.496499 90.578013,91.480641 90,91.1875 C 89.421987,90.894359 88.429852,89.981353 87.25,88.34375 C 84.890296,85.068543 81.724299,79.185679 77.03125,71.0625 C 76.654739,70.40782 75.941586,70.021025 75.1875,70.0625 z M 97.9375,99.03125 C 99.847583,98.899901 103.29363,100.88292 105.4375,104.59375 C 106.75724,106.8781 107.33023,109.26773 107.25,111.125 C 107.16977,112.98227 106.50165,114.13243 105.59375,114.65625 C 104.68591,115.18004 103.39934,115.17251 101.75,114.3125 C 100.10066,113.45249 98.288767,111.75356 96.96875,109.46875 C 95.649001,107.18439 95.076021,104.76352 95.15625,102.90625 C 95.236479,101.04898 95.873353,99.898826 96.78125,99.375 C 97.154526,99.159631 97.520851,99.0599 97.9375,99.03125 z "
|
||||||
|
id="path4570"
|
||||||
|
sodipodi:nodetypes="cccccsssssssscccsssssssc"
|
||||||
|
transform="matrix(-1,0,0,1,128.84383,0)" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient4443);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 75.1875,70.0625 C 74.330819,70.112586 73.601545,70.703549 73.375,71.53125 L 71.21875,79.59375 C 71.09204,80.103085 71.170605,80.641816 71.4375,81.09375 L 89.625,112.5625 C 91.972816,116.62633 95.167933,119.72417 98.625,121.46875 C 102.08207,123.21333 105.97364,123.61751 109.15625,121.78125 C 112.33881,119.94502 113.935,116.36699 114.15625,112.5 C 114.3775,108.63301 113.28602,104.31505 110.9375,100.25 C 108.5891,96.185153 105.39577,93.080216 101.9375,91.34375 C 98.479225,89.607284 94.586162,89.2278 91.40625,91.0625 C 90.654039,91.496499 90.578013,91.480641 90,91.1875 C 89.421987,90.894359 88.429852,89.981353 87.25,88.34375 C 84.890296,85.068543 81.724299,79.185679 77.03125,71.0625 C 76.654739,70.40782 75.941586,70.021025 75.1875,70.0625 z M 97.9375,99.03125 C 99.847583,98.899901 103.29363,100.88292 105.4375,104.59375 C 106.75724,106.8781 107.33023,109.26773 107.25,111.125 C 107.16977,112.98227 106.50165,114.13243 105.59375,114.65625 C 104.68591,115.18004 103.39934,115.17251 101.75,114.3125 C 100.10066,113.45249 98.288767,111.75356 96.96875,109.46875 C 95.649001,107.18439 95.076021,104.76352 95.15625,102.90625 C 95.236479,101.04898 95.873353,99.898826 96.78125,99.375 C 97.154526,99.159631 97.520851,99.0599 97.9375,99.03125 z "
|
||||||
|
id="path3845"
|
||||||
|
sodipodi:nodetypes="cccccsssssssscccsssssssc" />
|
||||||
|
<path
|
||||||
|
style="opacity:0.77227723;fill:url(#linearGradient4494);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
d="M 73.191419,70.312928 C 72.268749,70.366873 71.492489,71.011135 71.248498,71.902591 L 71.177846,72.185197 C 71.549903,71.760421 72.036582,71.477828 72.626206,71.443355 C 73.438379,71.398686 74.234264,71.798027 74.639778,72.50313 C 79.694311,81.252005 83.084654,87.592357 85.626114,91.119846 C 86.896846,92.883587 87.970948,93.877473 88.593484,94.193194 C 89.216019,94.508912 89.302343,94.519318 90.112495,94.051891 C 93.53734,92.075871 97.727432,92.499608 101.45209,94.369823 C 105.17675,96.240042 108.6021,99.5652 111.13137,103.94313 L 111.69658,102.8127 C 109.16731,98.434769 105.74197,95.109615 102.0173,93.239397 C 98.292646,91.369181 94.102554,90.945444 90.677709,92.921464 C 89.867557,93.388891 89.781233,93.378485 89.158698,93.062767 C 88.536161,92.747046 87.462059,91.75316 86.191327,89.989419 C 83.649868,86.461931 80.259524,80.121578 75.204992,71.372703 C 74.799477,70.667601 74.003592,70.268259 73.191419,70.312928 z "
|
||||||
|
id="path4479"
|
||||||
|
sodipodi:nodetypes="cccscssssccsssscc" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccsssssssscccsssssssc"
|
||||||
|
id="path4451"
|
||||||
|
d="M 75.1875,70.0625 C 74.330819,70.112586 73.601545,70.703549 73.375,71.53125 L 71.21875,79.59375 C 71.09204,80.103085 71.170605,80.641816 71.4375,81.09375 L 89.625,112.5625 C 91.972816,116.62633 95.167933,119.72417 98.625,121.46875 C 102.08207,123.21333 105.97364,123.61751 109.15625,121.78125 C 112.33881,119.94502 113.935,116.36699 114.15625,112.5 C 114.3775,108.63301 113.28602,104.31505 110.9375,100.25 C 108.5891,96.185153 105.39577,93.080216 101.9375,91.34375 C 98.479225,89.607284 94.586162,89.2278 91.40625,91.0625 C 90.654039,91.496499 90.578013,91.480641 90,91.1875 C 89.421987,90.894359 88.429852,89.981353 87.25,88.34375 C 84.890296,85.068543 81.724299,79.185679 77.03125,71.0625 C 76.654739,70.40782 75.941586,70.021025 75.1875,70.0625 z M 97.9375,99.03125 C 99.847583,98.899901 103.29363,100.88292 105.4375,104.59375 C 106.75724,106.8781 107.33023,109.26773 107.25,111.125 C 107.16977,112.98227 106.50165,114.13243 105.59375,114.65625 C 104.68591,115.18004 103.39934,115.17251 101.75,114.3125 C 100.10066,113.45249 98.288767,111.75356 96.96875,109.46875 C 95.649001,107.18439 95.076021,104.76352 95.15625,102.90625 C 95.236479,101.04898 95.873353,99.898826 96.78125,99.375 C 97.154526,99.159631 97.520851,99.0599 97.9375,99.03125 z "
|
||||||
|
style="fill:none;fill-opacity:1.0;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4475);opacity:0.7029703"
|
||||||
|
clip-path="url(#clipPath4455)" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient3802);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 97.96087,1.9111929 L 53.629372,72.750318 L 52.479384,84.564291 C 54.445388,81.161344 61.782615,76.320141 67.153838,74.881885 C 81.238527,50.502756 89.411871,28.739567 98.680477,4.5950145 C 98.954672,3.9035524 99.068368,2.5501817 97.96087,1.9111929 z "
|
||||||
|
id="path3506"
|
||||||
|
sodipodi:nodetypes="cccccc" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cc"
|
||||||
|
id="path4269"
|
||||||
|
d="M 97.692496,2.3849918 L 61.738989,59.428222"
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient3637);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 59.75 65.65625 L 57.71875 66.21875 L 56.28125 68.5 L 60.59375 77.71875 C 62.419602 76.674902 64.33553 75.770565 66.09375 75.1875 L 59.75 65.65625 z "
|
||||||
|
id="path3629" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient4259);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 67.1875 51.0625 L 59 64.15625 L 66.1875 75.15625 C 66.513817 75.049746 66.842006 74.959145 67.15625 74.875 C 69.715966 70.444398 72.069962 66.100297 74.28125 61.8125 L 67.1875 51.0625 z "
|
||||||
|
id="path4248" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="cccccc"
|
||||||
|
id="path2160"
|
||||||
|
d="M 30.642611,1.9111929 L 74.974109,72.750318 L 76.124096,84.564291 C 74.158093,81.161344 66.820866,76.320141 61.449644,74.881885 C 47.364955,50.502756 39.191609,28.739567 29.923004,4.5950145 C 29.648808,3.9035524 29.535112,2.5501817 30.642611,1.9111929 z "
|
||||||
|
style="fill:url(#linearGradient3617);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 30.738989,2.3849918 L 64.192496,55.928222"
|
||||||
|
id="path4267"
|
||||||
|
sodipodi:nodetypes="cc" />
|
||||||
|
<path
|
||||||
|
transform="matrix(1.4403715,-0.8310572,0.8315989,1.4394331,-75.999063,45.513227)"
|
||||||
|
d="M 68 54 A 2 2 0 1 1 64,54 A 2 2 0 1 1 68 54 z"
|
||||||
|
sodipodi:ry="2"
|
||||||
|
sodipodi:rx="2"
|
||||||
|
sodipodi:cy="54"
|
||||||
|
sodipodi:cx="66"
|
||||||
|
id="path3146"
|
||||||
|
style="opacity:0.96000001;fill:url(#radialGradient4728);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<image
|
||||||
|
y="0"
|
||||||
|
x="160"
|
||||||
|
id="image4278"
|
||||||
|
height="128"
|
||||||
|
width="128"
|
||||||
|
sodipodi:absref="/home/david/Oxygen/trunk/32x32/actions/edit-copy.png"
|
||||||
|
xlink:href="/home/david/Oxygen/trunk/32x32/actions/edit-copy.png" />
|
||||||
|
<image
|
||||||
|
y="0"
|
||||||
|
x="288"
|
||||||
|
id="image4288"
|
||||||
|
height="128"
|
||||||
|
width="128"
|
||||||
|
sodipodi:absref="/home/david/Oxygen/trunk/32x32/actions/edit-paste.png"
|
||||||
|
xlink:href="/home/david/Oxygen/trunk/32x32/actions/edit-paste.png" />
|
||||||
|
<path
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.70792079;filter:url(#filter4715)"
|
||||||
|
d="M 57.53125 79.25 L 39.71875 110.0625 C 37.370936 114.12633 34.175817 117.22417 30.71875 118.96875 C 27.26168 120.71333 23.37011 121.11751 20.1875 119.28125 C 17.00494 117.44502 15.40875 113.86699 15.1875 110 C 15.119229 108.80676 15.194921 107.57094 15.375 106.3125 C 14.812237 108.42607 14.574653 110.52767 14.6875 112.5 C 14.90875 116.36699 16.50494 119.94502 19.6875 121.78125 C 22.87011 123.61751 26.76168 123.21333 30.21875 121.46875 C 33.675817 119.72417 36.870936 116.62633 39.21875 112.5625 L 57.40625 81.09375 C 57.67315 80.641816 57.75171 80.103085 57.625 79.59375 L 57.53125 79.25 z M 31.40625 96.53125 C 29.496167 96.399901 26.05012 98.38292 23.90625 102.09375 C 22.840787 103.93797 22.266248 105.85407 22.125 107.5 C 22.422918 106.54782 22.850187 105.55624 23.40625 104.59375 C 25.55012 100.88292 28.996167 98.899901 30.90625 99.03125 C 31.322899 99.0599 31.689226 99.159631 32.0625 99.375 C 32.970397 99.898826 33.607273 101.04898 33.6875 102.90625 C 33.703141 103.26833 33.690955 103.66277 33.65625 104.0625 C 34.065399 102.74599 34.233925 101.48097 34.1875 100.40625 C 34.107273 98.54898 33.470397 97.398826 32.5625 96.875 C 32.189226 96.659631 31.822899 96.5599 31.40625 96.53125 z "
|
||||||
|
id="path4576" />
|
||||||
|
<path
|
||||||
|
id="path4609"
|
||||||
|
d="M 57.53125,79.25 L 39.71875,110.0625 C 37.370936,114.12633 34.175817,117.22417 30.71875,118.96875 C 27.26168,120.71333 23.37011,121.11751 20.1875,119.28125 C 17.00494,117.44502 15.40875,113.86699 15.1875,110 C 15.119229,108.80676 15.194921,107.57094 15.375,106.3125 C 14.812237,108.42607 14.574653,110.52767 14.6875,112.5 C 14.90875,116.36699 16.50494,119.94502 19.6875,121.78125 C 22.87011,123.61751 26.76168,123.21333 30.21875,121.46875 C 33.675817,119.72417 36.870936,116.62633 39.21875,112.5625 L 57.40625,81.09375 C 57.67315,80.641816 57.75171,80.103085 57.625,79.59375 L 57.53125,79.25 z M 31.40625,96.53125 C 29.496167,96.399901 26.05012,98.38292 23.90625,102.09375 C 22.840787,103.93797 22.266248,105.85407 22.125,107.5 C 22.422918,106.54782 22.850187,105.55624 23.40625,104.59375 C 25.55012,100.88292 28.996167,98.899901 30.90625,99.03125 C 31.322899,99.0599 31.689226,99.159631 32.0625,99.375 C 32.970397,99.898826 33.607273,101.04898 33.6875,102.90625 C 33.703141,103.26833 33.690955,103.66277 33.65625,104.0625 C 34.065399,102.74599 34.233925,101.48097 34.1875,100.40625 C 34.107273,98.54898 33.470397,97.398826 32.5625,96.875 C 32.189226,96.659631 31.822899,96.5599 31.40625,96.53125 z "
|
||||||
|
style="opacity:0.70792081;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4711)"
|
||||||
|
transform="matrix(-1,0,0,1,128.84431,0)" />
|
||||||
|
<path
|
||||||
|
style="opacity:0.48514851;fill:url(#linearGradient4641);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4691)"
|
||||||
|
d="M 33.1875,106.4375 C 32.888012,107.43505 32.455199,108.46448 31.875,109.46875 C 30.554983,111.75356 28.74309,113.45249 27.09375,114.3125 C 25.44441,115.17251 24.15784,115.18004 23.25,114.65625 C 22.3421,114.13243 21.67398,112.98227 21.59375,111.125 C 21.212006,112.3879 21.048791,113.58424 21.09375,114.625 C 21.17398,116.48227 21.8421,117.63243 22.75,118.15625 C 23.65784,118.68004 24.94441,118.67251 26.59375,117.8125 C 28.24309,116.95249 30.054983,115.25356 31.375,112.96875 C 32.687576,110.6968 33.260229,108.29075 33.1875,106.4375 z "
|
||||||
|
id="path4626"
|
||||||
|
sodipodi:nodetypes="cssscssssc"
|
||||||
|
transform="matrix(1.6395402,0,0,1.5188129,-15.9999,-58.979717)" />
|
||||||
|
<path
|
||||||
|
transform="matrix(-1.6395402,0,0,1.5188129,144.99452,-58.979717)"
|
||||||
|
sodipodi:nodetypes="cssscssssc"
|
||||||
|
id="path4699"
|
||||||
|
d="M 33.1875,106.4375 C 32.888012,107.43505 32.455199,108.46448 31.875,109.46875 C 30.554983,111.75356 28.74309,113.45249 27.09375,114.3125 C 25.44441,115.17251 24.15784,115.18004 23.25,114.65625 C 22.3421,114.13243 21.67398,112.98227 21.59375,111.125 C 21.212006,112.3879 21.048791,113.58424 21.09375,114.625 C 21.17398,116.48227 21.8421,117.63243 22.75,118.15625 C 23.65784,118.68004 24.94441,118.67251 26.59375,117.8125 C 28.24309,116.95249 30.054983,115.25356 31.375,112.96875 C 32.687576,110.6968 33.260229,108.29075 33.1875,106.4375 z "
|
||||||
|
style="opacity:0.48514851;fill:url(#linearGradient4701);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4691)" />
|
||||||
|
<path
|
||||||
|
style="opacity:0.77722772;fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 65.770092,66.282577 L 62.183456,70.557029"
|
||||||
|
id="path4730" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 43 KiB |
3302
imgsrc/edit-paste.svg
Normal file
After Width: | Height: | Size: 88 KiB |
722
imgsrc/swap.svg
@ -1,722 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://web.resource.org/cc/"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="128"
|
|
||||||
height="128"
|
|
||||||
id="svg2606"
|
|
||||||
sodipodi:version="0.32"
|
|
||||||
inkscape:version="0.45.1"
|
|
||||||
version="1.0"
|
|
||||||
sodipodi:docname="edit-undo.svgz"
|
|
||||||
inkscape:output_extension="org.inkscape.output.svgz.inkscape"
|
|
||||||
sodipodi:docbase="/home/david/oxygen/trunk/scalable/actions"
|
|
||||||
inkscape:export-filename="edit-undo.png"
|
|
||||||
inkscape:export-xdpi="11.25"
|
|
||||||
inkscape:export-ydpi="11.25">
|
|
||||||
<defs
|
|
||||||
id="defs2608">
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient3342">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#000000;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3344" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#000000;stop-opacity:0;"
|
|
||||||
offset="1"
|
|
||||||
id="stop3347" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="linearGradient3326">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#000000;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3328" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#000000;stop-opacity:0;"
|
|
||||||
offset="1"
|
|
||||||
id="stop3330" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient3825">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#ffffff;stop-opacity:0;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3827" />
|
|
||||||
<stop
|
|
||||||
id="stop3833"
|
|
||||||
offset="0.5"
|
|
||||||
style="stop-color:#ffffff;stop-opacity:0.18705036;" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#ffffff;stop-opacity:1;"
|
|
||||||
offset="1"
|
|
||||||
id="stop3829" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient3751">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#beba2c;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3753" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#b6be2c;stop-opacity:0;"
|
|
||||||
offset="1"
|
|
||||||
id="stop3755" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient3528">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#eaf209;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3530" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#c7c634;stop-opacity:0;"
|
|
||||||
offset="1"
|
|
||||||
id="stop3532" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient3295">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#fffe63;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3297" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#ffffff;stop-opacity:0;"
|
|
||||||
offset="1"
|
|
||||||
id="stop3299" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient3202">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#fcff9c;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3204" />
|
|
||||||
<stop
|
|
||||||
style="stop-color:#c1a965;stop-opacity:0;"
|
|
||||||
offset="1"
|
|
||||||
id="stop3206" />
|
|
||||||
</linearGradient>
|
|
||||||
<radialGradient
|
|
||||||
id="XMLID_4_"
|
|
||||||
cx="48"
|
|
||||||
cy="-0.2148"
|
|
||||||
r="55.148"
|
|
||||||
gradientTransform="matrix(0.9792,0,0,0.9725,133.0002,20.8762)"
|
|
||||||
gradientUnits="userSpaceOnUse">
|
|
||||||
<stop
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#cfd13d;stop-opacity:1;"
|
|
||||||
id="stop3082" />
|
|
||||||
<stop
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#db8900;stop-opacity:1;"
|
|
||||||
id="stop3090" />
|
|
||||||
</radialGradient>
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient3260"
|
|
||||||
inkscape:collect="always">
|
|
||||||
<stop
|
|
||||||
id="stop3262"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
|
||||||
<stop
|
|
||||||
id="stop3264"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#ffffff;stop-opacity:0;" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient3344">
|
|
||||||
<stop
|
|
||||||
id="stop3346"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#fdff63;stop-opacity:1;" />
|
|
||||||
<stop
|
|
||||||
id="stop3348"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#ffffff;stop-opacity:0;" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
id="linearGradient3449">
|
|
||||||
<stop
|
|
||||||
id="stop3451"
|
|
||||||
offset="0"
|
|
||||||
style="stop-color:#000000;stop-opacity:1;" />
|
|
||||||
<stop
|
|
||||||
id="stop3453"
|
|
||||||
offset="1"
|
|
||||||
style="stop-color:#000000;stop-opacity:0;" />
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#XMLID_4_"
|
|
||||||
id="linearGradient3516"
|
|
||||||
x1="147.09375"
|
|
||||||
y1="33.40625"
|
|
||||||
x2="8.083992"
|
|
||||||
y2="123.90625"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
<radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#XMLID_4_"
|
|
||||||
id="radialGradient3524"
|
|
||||||
cx="67.09375"
|
|
||||||
cy="116.90625"
|
|
||||||
fx="67.09375"
|
|
||||||
fy="116.90625"
|
|
||||||
r="56"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
<radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3528"
|
|
||||||
id="radialGradient3535"
|
|
||||||
cx="99.726295"
|
|
||||||
cy="27.418272"
|
|
||||||
fx="64.689766"
|
|
||||||
fy="68.231934"
|
|
||||||
r="56"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(0.693735,5.8671246e-2,-3.6242796e-2,0.4285387,33.939389,26.8809)" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3295"
|
|
||||||
id="linearGradient3548"
|
|
||||||
x1="75.09375"
|
|
||||||
y1="4.5317035"
|
|
||||||
x2="75.09375"
|
|
||||||
y2="80.172485"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3260"
|
|
||||||
id="linearGradient3581"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="translate(4.2161108e-3,1.9705695e-3)"
|
|
||||||
x1="75.09375"
|
|
||||||
y1="4.5317035"
|
|
||||||
x2="75.09375"
|
|
||||||
y2="80.172485" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3295"
|
|
||||||
id="linearGradient3613"
|
|
||||||
x1="208.59375"
|
|
||||||
y1="130.40625"
|
|
||||||
x2="208.59375"
|
|
||||||
y2="63.426777"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="translate(-137,0)" />
|
|
||||||
<filter
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="filter3639">
|
|
||||||
<feGaussianBlur
|
|
||||||
inkscape:collect="always"
|
|
||||||
stdDeviation="1.0580524"
|
|
||||||
id="feGaussianBlur3641" />
|
|
||||||
</filter>
|
|
||||||
<radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3449"
|
|
||||||
id="radialGradient3654"
|
|
||||||
cx="-10.165252"
|
|
||||||
cy="66.906013"
|
|
||||||
fx="-10.165252"
|
|
||||||
fy="66.906013"
|
|
||||||
r="59.995121"
|
|
||||||
gradientTransform="matrix(0.4582893,-2.1035589e-8,4.5903973e-8,1.0000813,20.447953,-5.1974351e-3)"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
<radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3449"
|
|
||||||
id="radialGradient3658"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(0.2676699,0.521376,-0.7037472,0.3612977,108.99386,-36.062981)"
|
|
||||||
cx="167.67001"
|
|
||||||
cy="80.404922"
|
|
||||||
fx="167.67001"
|
|
||||||
fy="80.404922"
|
|
||||||
r="59.995121" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3260"
|
|
||||||
id="linearGradient3676"
|
|
||||||
x1="120.0625"
|
|
||||||
y1="12.569496"
|
|
||||||
x2="125.30366"
|
|
||||||
y2="14.444496"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
spreadMethod="reflect" />
|
|
||||||
<filter
|
|
||||||
inkscape:collect="always"
|
|
||||||
x="-0.15096202"
|
|
||||||
width="1.301924"
|
|
||||||
y="-0.13732364"
|
|
||||||
height="1.2746473"
|
|
||||||
id="filter3738">
|
|
||||||
<feGaussianBlur
|
|
||||||
inkscape:collect="always"
|
|
||||||
stdDeviation="0.39257441"
|
|
||||||
id="feGaussianBlur3740" />
|
|
||||||
</filter>
|
|
||||||
<radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3449"
|
|
||||||
id="radialGradient3744"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(0.982366,1.671718e-2,-3.5801148e-3,0.2103843,-18.56344,30.477792)"
|
|
||||||
cx="72.684891"
|
|
||||||
cy="48.228905"
|
|
||||||
fx="74.871155"
|
|
||||||
fy="26.862719"
|
|
||||||
r="59.995121" />
|
|
||||||
<radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3751"
|
|
||||||
id="radialGradient3757"
|
|
||||||
cx="66.01458"
|
|
||||||
cy="126.69183"
|
|
||||||
fx="66.01458"
|
|
||||||
fy="126.69183"
|
|
||||||
r="59.99512"
|
|
||||||
gradientTransform="matrix(0.675025,0,0,0.3583625,19.527377,41.004647)"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
<radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3260"
|
|
||||||
id="radialGradient3767"
|
|
||||||
cx="64.088867"
|
|
||||||
cy="7.4108429"
|
|
||||||
fx="64.088867"
|
|
||||||
fy="7.4108429"
|
|
||||||
r="59.995121"
|
|
||||||
gradientTransform="matrix(0.3093869,0,0,0.4779247,44.260611,3.8644223)"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3344"
|
|
||||||
id="linearGradient3771"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
spreadMethod="reflect"
|
|
||||||
x1="120.0625"
|
|
||||||
y1="12.569496"
|
|
||||||
x2="125.30366"
|
|
||||||
y2="14.444496" />
|
|
||||||
<filter
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="filter3438">
|
|
||||||
<feGaussianBlur
|
|
||||||
inkscape:collect="always"
|
|
||||||
stdDeviation="1.3342697"
|
|
||||||
id="feGaussianBlur3440" />
|
|
||||||
</filter>
|
|
||||||
<filter
|
|
||||||
inkscape:collect="always"
|
|
||||||
id="filter3630">
|
|
||||||
<feGaussianBlur
|
|
||||||
inkscape:collect="always"
|
|
||||||
stdDeviation="0.89883985"
|
|
||||||
id="feGaussianBlur3632" />
|
|
||||||
</filter>
|
|
||||||
<radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3825"
|
|
||||||
id="radialGradient2361"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(0.6484284,0.1017206,-3.1257154e-2,0.1992521,-4.56257,53.15916)"
|
|
||||||
cx="-112.17241"
|
|
||||||
cy="118.60459"
|
|
||||||
fx="-113.14772"
|
|
||||||
fy="59.708473"
|
|
||||||
r="59.99512" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3326"
|
|
||||||
id="linearGradient2363"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="-151.43935"
|
|
||||||
y1="37.68198"
|
|
||||||
x2="-152.26776"
|
|
||||||
y2="57.25" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3326"
|
|
||||||
id="linearGradient2365"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="-132.51041"
|
|
||||||
y1="39.803303"
|
|
||||||
x2="-158.92462"
|
|
||||||
y2="72.881729" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3326"
|
|
||||||
id="linearGradient2367"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="-83.012932"
|
|
||||||
y1="44.753052"
|
|
||||||
x2="-158.92462"
|
|
||||||
y2="72.881729" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3342"
|
|
||||||
id="linearGradient3349"
|
|
||||||
x1="-73"
|
|
||||||
y1="105.625"
|
|
||||||
x2="-163"
|
|
||||||
y2="86.125"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
<filter
|
|
||||||
inkscape:collect="always"
|
|
||||||
x="-0.087741371"
|
|
||||||
width="1.1754827"
|
|
||||||
y="-0.10211017"
|
|
||||||
height="1.2042203"
|
|
||||||
id="filter3363">
|
|
||||||
<feGaussianBlur
|
|
||||||
inkscape:collect="always"
|
|
||||||
stdDeviation="3.0526685"
|
|
||||||
id="feGaussianBlur3365" />
|
|
||||||
</filter>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3342"
|
|
||||||
id="linearGradient3372"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="translate(-40.5,-1.5)"
|
|
||||||
x1="-83.593941"
|
|
||||||
y1="137.13324"
|
|
||||||
x2="-138.0043"
|
|
||||||
y2="92.603989" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3342"
|
|
||||||
id="linearGradient3376"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="translate(-40.5,-1.5)"
|
|
||||||
x1="-61.802711"
|
|
||||||
y1="99.979607"
|
|
||||||
x2="-136.51074"
|
|
||||||
y2="112.70422" />
|
|
||||||
<radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3825"
|
|
||||||
id="radialGradient3388"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(0.6484284,0.1017206,-3.1257154e-2,0.1992521,-4.56257,53.15916)"
|
|
||||||
cx="-112.17241"
|
|
||||||
cy="118.60459"
|
|
||||||
fx="-113.14772"
|
|
||||||
fy="59.708473"
|
|
||||||
r="59.99512" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3326"
|
|
||||||
id="linearGradient3390"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="-151.43935"
|
|
||||||
y1="37.68198"
|
|
||||||
x2="-152.26776"
|
|
||||||
y2="57.25" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3326"
|
|
||||||
id="linearGradient3392"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="-132.51041"
|
|
||||||
y1="39.803303"
|
|
||||||
x2="-158.92462"
|
|
||||||
y2="72.881729" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3326"
|
|
||||||
id="linearGradient3394"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="-83.012932"
|
|
||||||
y1="44.753052"
|
|
||||||
x2="-158.92462"
|
|
||||||
y2="72.881729" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3342"
|
|
||||||
id="linearGradient3396"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="-73"
|
|
||||||
y1="105.625"
|
|
||||||
x2="-163"
|
|
||||||
y2="86.125" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3342"
|
|
||||||
id="linearGradient3398"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="translate(-40.5,-1.5)"
|
|
||||||
x1="-83.593941"
|
|
||||||
y1="137.13324"
|
|
||||||
x2="-138.0043"
|
|
||||||
y2="92.603989" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3342"
|
|
||||||
id="linearGradient3400"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="translate(-40.5,-1.5)"
|
|
||||||
x1="-61.802711"
|
|
||||||
y1="99.979607"
|
|
||||||
x2="-136.51074"
|
|
||||||
y2="112.70422" />
|
|
||||||
<radialGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3825"
|
|
||||||
id="radialGradient3422"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="matrix(0.6484284,0.1017206,-3.1257154e-2,0.1992521,-4.56257,53.15916)"
|
|
||||||
cx="-112.17241"
|
|
||||||
cy="118.60459"
|
|
||||||
fx="-113.14772"
|
|
||||||
fy="59.708473"
|
|
||||||
r="59.99512" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3326"
|
|
||||||
id="linearGradient3424"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="-151.43935"
|
|
||||||
y1="37.68198"
|
|
||||||
x2="-152.26776"
|
|
||||||
y2="57.25" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3326"
|
|
||||||
id="linearGradient3426"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="-132.51041"
|
|
||||||
y1="39.803303"
|
|
||||||
x2="-158.92462"
|
|
||||||
y2="72.881729" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3326"
|
|
||||||
id="linearGradient3428"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="-83.012932"
|
|
||||||
y1="44.753052"
|
|
||||||
x2="-158.92462"
|
|
||||||
y2="72.881729" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3342"
|
|
||||||
id="linearGradient3430"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
x1="-73"
|
|
||||||
y1="105.625"
|
|
||||||
x2="-163"
|
|
||||||
y2="86.125" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3342"
|
|
||||||
id="linearGradient3432"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="translate(-40.5,-1.5)"
|
|
||||||
x1="-83.593941"
|
|
||||||
y1="137.13324"
|
|
||||||
x2="-138.0043"
|
|
||||||
y2="92.603989" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3342"
|
|
||||||
id="linearGradient3434"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="translate(-40.5,-1.5)"
|
|
||||||
x1="-61.802711"
|
|
||||||
y1="99.979607"
|
|
||||||
x2="-136.51074"
|
|
||||||
y2="112.70422" />
|
|
||||||
<mask
|
|
||||||
maskUnits="userSpaceOnUse"
|
|
||||||
id="mask3402">
|
|
||||||
<g
|
|
||||||
id="g3404"
|
|
||||||
transform="translate(167.50257,-3.755156e-3)">
|
|
||||||
<g
|
|
||||||
id="g3406"
|
|
||||||
transform="translate(80.51637,30.885255)">
|
|
||||||
<path
|
|
||||||
style="opacity:1;fill:url(#radialGradient3422);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1"
|
|
||||||
d="M -184.42232,-32.47243 C -217.54751,-32.47243 -248.42232,-0.097625 -248.42232,33.02757 C -248.42232,66.15276 -217.04751,97.02757 -183.92232,97.02757 C -153.6332,97.02757 -128.58571,70.81131 -124.51607,41.68382 L -159.54732,36.65257 C -161.172,48.6137 -171.47739,57.62132 -183.92232,57.62132 C -197.49395,57.62132 -206.01607,46.0992 -206.01607,32.52757 C -206.01607,18.955936 -199.99395,12.43382 -186.42232,12.43382 C -179.6365,12.433819 -176.50103,10.198864 -172.04732,14.65257 L -176.8745,25.979749 C -178.93037,28.035619 -179.11822,29.285529 -178.55411,30.595278 C -178.04554,31.776057 -177.03338,33.12132 -174.34438,33.12132 L -130.39107,33.12132 C -126.54518,33.12132 -123.93208,30.466941 -123.93208,26.871189 L -124.00095,-17.206829 C -124.00095,-19.687584 -124.90346,-21.050058 -126.18242,-21.556444 C -127.49674,-22.076829 -129.21563,-21.679122 -131.28951,-19.605244 L -141.48482,-19.40993 C -152.34417,-30.269281 -167.85972,-32.47243 -184.42232,-32.47243 z "
|
|
||||||
id="path3408"
|
|
||||||
sodipodi:nodetypes="cssccsssccsccccsccc" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="ccccc"
|
|
||||||
style="fill:url(#linearGradient3424);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3438)"
|
|
||||||
d="M -161.5,34.5 C -162,37 -180,54 -180,54 L -132.5,80 L -112,38.5 L -161.5,34.5 z "
|
|
||||||
id="path3410" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="ccccc"
|
|
||||||
id="path3412"
|
|
||||||
d="M -161.5,34.5 C -162,37 -181.27817,54.389087 -181.27817,54.389087 L -151.62742,97.591883 L -112,38.5 L -161.5,34.5 z "
|
|
||||||
style="fill:url(#linearGradient3426);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3438)" />
|
|
||||||
<path
|
|
||||||
style="fill:url(#linearGradient3428);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3438)"
|
|
||||||
d="M -161.5,34.5 C -162,37 -181.27817,54.389087 -181.27817,54.389087 L -151.62742,97.591883 L -112,38.5 L -161.5,34.5 z "
|
|
||||||
id="path3414"
|
|
||||||
sodipodi:nodetypes="ccccc" />
|
|
||||||
</g>
|
|
||||||
<rect
|
|
||||||
y="69.75"
|
|
||||||
x="-119"
|
|
||||||
height="71.75"
|
|
||||||
width="83.5"
|
|
||||||
id="rect3416"
|
|
||||||
style="opacity:1;fill:url(#linearGradient3430);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3363)" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="ccccc"
|
|
||||||
id="path3418"
|
|
||||||
d="M -159.5,68.25 L -39.138259,55.983708 L -93.453327,162.55286 L -197.79465,128.96507 L -159.5,68.25 z "
|
|
||||||
style="fill:url(#linearGradient3432);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3363)"
|
|
||||||
transform="matrix(0.6393762,0.7688941,-0.7688941,0.6393762,37.597642,128.08723)" />
|
|
||||||
<path
|
|
||||||
transform="matrix(0.6393762,0.7688941,-0.7688941,0.6393762,37.597642,128.08723)"
|
|
||||||
style="fill:url(#linearGradient3434);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3363)"
|
|
||||||
d="M -159.5,68.25 L -39.138259,55.983708 L -93.453327,162.55286 L -197.79465,128.96507 L -159.5,68.25 z "
|
|
||||||
id="path3420"
|
|
||||||
sodipodi:nodetypes="ccccc" />
|
|
||||||
</g>
|
|
||||||
</mask>
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3751"
|
|
||||||
id="linearGradient3565"
|
|
||||||
x1="-267.47665"
|
|
||||||
y1="18.103027"
|
|
||||||
x2="-33.476654"
|
|
||||||
y2="18.103027"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
<linearGradient
|
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient3295"
|
|
||||||
id="linearGradient3567"
|
|
||||||
gradientUnits="userSpaceOnUse"
|
|
||||||
gradientTransform="translate(-137,0)"
|
|
||||||
x1="208.59375"
|
|
||||||
y1="130.40625"
|
|
||||||
x2="208.59375"
|
|
||||||
y2="63.426777" />
|
|
||||||
</defs>
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="4.6484375"
|
|
||||||
inkscape:cx="64"
|
|
||||||
inkscape:cy="64"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
width="128px"
|
|
||||||
height="128px"
|
|
||||||
gridspacingx="4px"
|
|
||||||
gridspacingy="4px"
|
|
||||||
gridempspacing="2"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:grid-points="true"
|
|
||||||
showguides="true"
|
|
||||||
inkscape:guide-bbox="true"
|
|
||||||
inkscape:window-width="748"
|
|
||||||
inkscape:window-height="681"
|
|
||||||
inkscape:window-x="526"
|
|
||||||
inkscape:window-y="51" />
|
|
||||||
<metadata
|
|
||||||
id="metadata2611">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Livello 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1">
|
|
||||||
<g
|
|
||||||
id="g3835"
|
|
||||||
mask="url(#mask3402)"
|
|
||||||
transform="matrix(-1,0,0,1,128.17774,0)">
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="cssccsssccsccccsccc"
|
|
||||||
id="rect3204"
|
|
||||||
d="M 64.09375,3.90625 C 30.968558,3.9062499 4.0937499,30.781055 4.09375,63.90625 C 4.0937501,97.031442 30.96856,123.90625 64.09375,123.90625 C 94.382866,123.90625 119.43036,101.68999 123.5,72.5625 L 88.46875,67.53125 C 86.844066,79.492379 76.538676,88.5 64.09375,88.5 C 50.522122,88.499999 39.5,77.477881 39.5,63.90625 C 39.500001,50.334616 50.522119,39.3125 64.09375,39.3125 C 70.879568,39.312499 77.015044,42.077544 81.46875,46.53125 L 71.141571,56.858429 C 69.085701,58.914299 68.897846,60.164209 69.461963,61.473958 C 69.970531,62.654737 70.982695,64 73.671688,64 L 117.625,64 C 121.47089,64 124.08399,61.345621 124.08399,57.749869 L 124.01512,13.671851 C 124.01512,11.191096 123.11261,9.8286218 121.83365,9.3222363 C 120.51933,8.8018514 118.80044,9.1995576 116.72656,11.273436 L 106.53125,21.46875 C 95.671902,10.609399 80.656349,3.90625 64.09375,3.90625 z "
|
|
||||||
style="opacity:1;fill:url(#linearGradient3516);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1" />
|
|
||||||
<path
|
|
||||||
style="opacity:0.79775277;fill:url(#radialGradient3757);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1"
|
|
||||||
d="M 64.09375,3.90625 C 30.968558,3.9062499 4.0937499,30.781055 4.09375,63.90625 C 4.0937501,97.031442 30.96856,123.90625 64.09375,123.90625 C 94.382866,123.90625 119.43036,101.68999 123.5,72.5625 L 88.46875,67.53125 C 86.844066,79.492379 76.538676,88.5 64.09375,88.5 C 50.522122,88.499999 39.5,77.477881 39.5,63.90625 C 39.500001,50.334616 50.522119,39.3125 64.09375,39.3125 C 70.879568,39.312499 77.015044,42.077544 81.46875,46.53125 L 71.141571,56.858429 C 69.085701,58.914299 68.897846,60.164209 69.461963,61.473958 C 69.970531,62.654737 70.982695,64 73.671688,64 L 117.625,64 C 121.47089,64 124.08399,61.345621 124.08399,57.749869 L 124.01512,13.671851 C 124.01512,11.191096 123.11261,9.8286218 121.83365,9.3222363 C 120.51933,8.8018514 118.80044,9.1995576 116.72656,11.273436 L 106.53125,21.46875 C 95.671902,10.609399 80.656349,3.90625 64.09375,3.90625 z "
|
|
||||||
id="path3749"
|
|
||||||
sodipodi:nodetypes="cssccsssccsccccsccc" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="cssccsssccsccccsccc"
|
|
||||||
id="path3656"
|
|
||||||
d="M 64.09375,3.90625 C 30.968558,3.9062499 4.0937499,30.781055 4.09375,63.90625 C 4.0937501,97.031442 30.96856,123.90625 64.09375,123.90625 C 94.382866,123.90625 119.43036,101.68999 123.5,72.5625 L 88.46875,67.53125 C 86.844066,79.492379 76.538676,88.5 64.09375,88.5 C 50.522122,88.499999 39.5,77.477881 39.5,63.90625 C 39.500001,50.334616 50.522119,39.3125 64.09375,39.3125 C 70.879568,39.312499 77.015044,42.077544 81.46875,46.53125 L 71.141571,56.858429 C 69.085701,58.914299 68.897846,60.164209 69.461963,61.473958 C 69.970531,62.654737 70.982695,64 73.671688,64 L 117.625,64 C 121.47089,64 124.08399,61.345621 124.08399,57.749869 L 124.01512,13.671851 C 124.01512,11.191096 123.11261,9.8286218 121.83365,9.3222363 C 120.51933,8.8018514 118.80044,9.1995576 116.72656,11.273436 L 106.53125,21.46875 C 95.671902,10.609399 80.656349,3.90625 64.09375,3.90625 z "
|
|
||||||
style="opacity:0.68913861;fill:url(#radialGradient3658);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1" />
|
|
||||||
<path
|
|
||||||
style="opacity:1;fill:url(#radialGradient3654);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1"
|
|
||||||
d="M 64.09375,3.90625 C 30.968558,3.9062499 4.0937499,30.781055 4.09375,63.90625 C 4.0937501,97.031442 30.96856,123.90625 64.09375,123.90625 C 94.382866,123.90625 119.43036,101.68999 123.5,72.5625 L 88.46875,67.53125 C 86.844066,79.492379 76.538676,88.5 64.09375,88.5 C 50.522122,88.499999 39.5,77.477881 39.5,63.90625 C 39.500001,50.334616 50.522119,39.3125 64.09375,39.3125 C 70.879568,39.312499 77.015044,42.077544 81.46875,46.53125 L 71.141571,56.858429 C 69.085701,58.914299 68.897846,60.164209 69.461963,61.473958 C 69.970531,62.654737 70.982695,64 73.671688,64 L 117.625,64 C 121.47089,64 124.08399,61.345621 124.08399,57.749869 L 124.01512,13.671851 C 124.01512,11.191096 123.11261,9.8286218 121.83365,9.3222363 C 120.51933,8.8018514 118.80044,9.1995576 116.72656,11.273436 L 106.53125,21.46875 C 95.671902,10.609399 80.656349,3.90625 64.09375,3.90625 z "
|
|
||||||
id="path3643"
|
|
||||||
sodipodi:nodetypes="cssccsssccsccccsccc" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="cssccsssccsccccsccc"
|
|
||||||
id="path3742"
|
|
||||||
d="M 64.09375,3.90625 C 30.968558,3.9062499 4.0937499,30.781055 4.09375,63.90625 C 4.0937501,97.031442 30.96856,123.90625 64.09375,123.90625 C 94.382866,123.90625 119.43036,101.68999 123.5,72.5625 L 88.46875,67.53125 C 86.844066,79.492379 76.538676,88.5 64.09375,88.5 C 50.522122,88.499999 39.5,77.477881 39.5,63.90625 C 39.500001,50.334616 50.522119,39.3125 64.09375,39.3125 C 70.879568,39.312499 77.015044,42.077544 81.46875,46.53125 L 71.141571,56.858429 C 69.085701,58.914299 68.897846,60.164209 69.461963,61.473958 C 69.970531,62.654737 70.982695,64 73.671688,64 L 117.625,64 C 121.47089,64 124.08399,61.345621 124.08399,57.749869 L 124.01512,13.671851 C 124.01512,11.191096 123.11261,9.8286218 121.83365,9.3222363 C 120.51933,8.8018514 118.80044,9.1995576 116.72656,11.273436 L 106.53125,21.46875 C 95.671902,10.609399 80.656349,3.90625 64.09375,3.90625 z "
|
|
||||||
style="opacity:0.79775277;fill:url(#radialGradient3744);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1" />
|
|
||||||
<path
|
|
||||||
style="opacity:0.74531836;fill:url(#radialGradient3767);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3630)"
|
|
||||||
d="M 64.09375,4.20625 C 30.968558,4.2062499 4.0937499,30.781055 4.09375,63.90625 C 4.0937501,97.031442 30.96856,123.90625 64.09375,123.90625 C 94.382866,123.90625 119.43036,101.68999 123.5,72.5625 L 88.46875,67.53125 C 86.844066,79.492379 76.538676,88.5 64.09375,88.5 C 50.522122,88.499999 39.5,77.477881 39.5,63.90625 C 39.500001,50.334616 50.522119,39.3125 64.09375,39.3125 C 70.879568,39.312499 77.015044,42.077544 81.46875,46.53125 L 71.141571,56.858429 C 69.085701,58.914299 68.897846,60.164209 69.461963,61.473958 C 69.970531,62.654737 70.982695,64 73.671688,64 L 117.625,64 C 121.47089,64 124.08399,61.345621 124.08399,57.749869 L 124.01512,13.671851 C 124.01512,11.191096 123.11261,9.8286218 121.83365,9.3222363 C 120.51933,8.8018514 118.80044,9.1995576 116.72656,11.273436 L 106.53125,21.46875 C 95.671902,10.609399 80.656349,4.20625 64.09375,4.20625 z "
|
|
||||||
id="path3759"
|
|
||||||
sodipodi:nodetypes="cssccsssccsccccsccc" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="cccczc"
|
|
||||||
id="path3660"
|
|
||||||
d="M 117.6875,10.75 L 118.625,15.125 L 119.875,16 L 123.875,13.375 C 124.12188,11.651249 123.52383,10.027571 121.9375,9.3749999 C 120.35116,8.7224285 118.77622,9.5017032 117.6875,10.75 z "
|
|
||||||
style="opacity:0.82022472;fill:url(#linearGradient3676);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3738)" />
|
|
||||||
<path
|
|
||||||
transform="matrix(0,1,1,0,60.363582,-60.363586)"
|
|
||||||
style="opacity:0.82022472;fill:url(#linearGradient3771);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3738)"
|
|
||||||
d="M 117.6875,10.75 L 119.875,13.875 L 120.375,13.75 L 123.875,13.375 C 124.12188,11.651249 123.52383,10.027571 121.9375,9.3749999 C 120.35116,8.7224285 118.77622,9.5017032 117.6875,10.75 z "
|
|
||||||
id="path3769"
|
|
||||||
sodipodi:nodetypes="cccczc" />
|
|
||||||
<path
|
|
||||||
id="path3494"
|
|
||||||
d="M 64.09375,7.90625 C 33.132052,7.9062499 8.0937499,32.944549 8.09375,63.90625 C 8.0937501,94.867948 33.132054,119.90625 64.09375,119.90625 C 91.026646,119.90625 113.21548,101.0995 118.625,75.90625 L 91.5,72.03125 C 88.061436,83.928551 77.059621,92.5 64.09375,92.5 C 48.356404,92.499999 35.5,79.643599 35.5,63.90625 C 35.500001,48.168899 48.356402,35.3125 64.09375,35.3125 C 71.966166,35.312499 79.145304,38.520304 84.3125,43.6875 C 85.071964,44.438909 85.499997,45.462886 85.5,46.53125 C 85.5,47.599614 85.071964,48.623591 84.3125,49.375 L 73.6875,60 L 117.625,60 C 119.63039,60 120.09375,59.407836 120.09375,57.75 L 120,13.65625 L 109.375,24.3125 C 108.62359,25.071964 107.59961,25.5 106.53125,25.5 C 105.46289,25.5 104.43891,25.071964 103.6875,24.3125 C 93.549835,14.174833 79.577106,7.90625 64.09375,7.90625 z "
|
|
||||||
style="opacity:1;fill:url(#radialGradient3524);fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
|
|
||||||
<path
|
|
||||||
style="opacity:1;fill:url(#radialGradient3535);fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
|
|
||||||
d="M 64.09375,7.90625 C 33.132052,7.9062499 8.0937499,32.944549 8.09375,63.90625 C 8.0937501,94.867948 33.132054,119.90625 64.09375,119.90625 C 91.026646,119.90625 113.21548,101.0995 118.625,75.90625 L 91.5,72.03125 C 88.061436,83.928551 77.059621,92.5 64.09375,92.5 C 48.356404,92.499999 35.5,79.643599 35.5,63.90625 C 35.500001,48.168899 48.356402,35.3125 64.09375,35.3125 C 71.966166,35.312499 79.145304,38.520304 84.3125,43.6875 C 85.071964,44.438909 85.499997,45.462886 85.5,46.53125 C 85.5,47.599614 85.071964,48.623591 84.3125,49.375 L 73.6875,60 L 117.625,60 C 119.63039,60 120.09375,59.407836 120.09375,57.75 L 120,13.65625 L 109.375,24.3125 C 108.62359,25.071964 107.59961,25.5 106.53125,25.5 C 105.46289,25.5 104.43891,25.071964 103.6875,24.3125 C 93.549835,14.174833 79.577106,7.90625 64.09375,7.90625 z "
|
|
||||||
id="path3526" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="csccssccccccscc"
|
|
||||||
id="path3537"
|
|
||||||
d="M 64.09375,7.90625 C 33.132052,7.9062499 8.0937499,32.944549 8.09375,63.90625 C 8.09375,64.474122 8.1082724,65.029981 8.125,65.59375 C 14.11447,66.271402 20.266218,66.74388 26.53125,67 C 26.260548,56.540958 30.202859,46.025084 38.34375,38.21875 C 53.683067,23.509813 78.072313,24.004431 92.78125,39.34375 C 95.545099,42.226046 97.537852,45.032117 99.34375,48.59375 L 78.84375,59 L 98,59 C 105.9282,56.973373 113.18621,55.563033 120.09375,52.8125 L 120,13.65625 L 109.375,24.3125 C 108.62359,25.071964 107.59961,25.5 106.53125,25.5 C 105.46289,25.5 104.43891,25.071964 103.6875,24.3125 C 93.549835,14.174833 79.577106,7.90625 64.09375,7.90625 z "
|
|
||||||
style="opacity:1;fill:url(#linearGradient3548);fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="cscscscccccccccccssssssccscscc"
|
|
||||||
id="path3553"
|
|
||||||
d="M 64.099866,7.9087646 C 33.138176,7.9087644 8.0998661,32.947063 8.0998661,63.908764 C 8.0998761,64.087476 8.0973761,64.263059 8.0998661,64.440014 C 8.3531061,33.696509 33.295846,8.9087645 64.099866,8.9087646 C 79.583236,8.9087645 93.555946,15.177347 103.69361,25.315014 C 104.44503,26.074479 105.469,26.502514 106.53736,26.502514 C 107.60573,26.502515 108.6297,26.074478 109.38111,25.315014 L 119.50611,15.158764 L 119.99986,52.708764 C 113.09232,55.459294 105.43431,56.569624 97.506116,58.596264 L 78.849866,59.002514 L 98.006116,59.002514 C 105.93431,56.975884 113.19232,55.565544 120.09986,52.815014 L 120.00611,14.658764 L 120.00611,13.658764 L 119.50611,14.158764 L 109.38111,24.315014 C 108.62971,25.074479 107.60572,25.502514 106.53736,25.502514 C 105.46901,25.502515 104.44502,25.074478 103.69361,24.315014 C 103.68314,24.304548 103.67283,24.294222 103.66236,24.283764 C 103.60999,24.231473 103.55869,24.179598 103.50611,24.127514 C 102.93231,23.559643 102.35524,23.012364 101.75611,22.471264 C 101.67459,22.397145 101.58807,22.326157 101.50611,22.252514 C 91.590066,13.342335 78.496526,7.9087646 64.099866,7.9087646 z M 63.443616,27.127514 C 54.205446,27.378034 45.040176,30.920194 37.849866,37.815014 C 30.217786,45.133448 26.722316,55.187931 26.537366,65.033764 C 26.777246,55.231884 30.717786,45.539698 38.349866,38.221264 C 51.665996,25.452364 71.803196,24.123207 86.506116,34.033764 C 79.627056,29.22869 71.518656,26.908534 63.443616,27.127514 z "
|
|
||||||
style="opacity:1;fill:url(#linearGradient3581);fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
|
|
||||||
<path
|
|
||||||
id="path3603"
|
|
||||||
d="M 63.59375,7.90625 C 32.63205,7.9062499 7.59375,32.944549 7.59375,63.90625 C 7.59375,94.867948 32.63205,119.90625 63.59375,119.90625 C 90.52665,119.90625 112.71548,101.0995 118.125,75.90625 L 91,72.03125 C 87.56144,83.928551 76.55962,92.5 63.59375,92.5 C 47.8564,92.499999 35,79.643599 35,63.90625 C 35,48.168899 47.8564,35.3125 63.59375,35.3125 C 71.46617,35.312499 78.6453,38.520304 83.8125,43.6875 C 84.57196,44.438909 85,45.462886 85,46.53125 C 85,47.599614 84.57196,48.623591 83.8125,49.375 L 73.1875,60 L 117.125,60 C 119.13039,60 119.59375,59.407836 119.59375,57.75 L 119.5,13.65625 L 108.875,24.3125 C 108.12359,25.071964 107.09961,25.5 106.03125,25.5 C 104.96289,25.5 103.93891,25.071964 103.1875,24.3125 C 93.04984,14.174833 79.07711,7.90625 63.59375,7.90625 z "
|
|
||||||
style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient3567);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3639)" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 35 KiB |
@ -12,13 +12,24 @@ defaults.
|
|||||||
|
|
||||||
|
|
||||||
# The algorithm used to assign a new book in an existing series a series number.
|
# The algorithm used to assign a new book in an existing series a series number.
|
||||||
|
# New series numbers assigned using this tweak are always integer values, except
|
||||||
|
# if a constant non-integer is specified.
|
||||||
# Possible values are:
|
# Possible values are:
|
||||||
# next - Next available number
|
# next - First available integer larger than the largest existing number
|
||||||
|
# first_free - First available integer larger than 0
|
||||||
|
# next_free - First available integer larger than the smallest existing number
|
||||||
|
# last_free - First available integer smaller than the largest existing number
|
||||||
|
# Return largest existing + 1 if no free number is found
|
||||||
# const - Assign the number 1 always
|
# const - Assign the number 1 always
|
||||||
|
# a number - Assign that number always. The number is not in quotes. Note that
|
||||||
|
# 0.0 can be used here.
|
||||||
|
# Examples:
|
||||||
|
# series_index_auto_increment = 'next'
|
||||||
|
# series_index_auto_increment = 'next_free'
|
||||||
|
# series_index_auto_increment = 16.5
|
||||||
series_index_auto_increment = 'next'
|
series_index_auto_increment = 'next'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# The algorithm used to copy author to author_sort
|
# The algorithm used to copy author to author_sort
|
||||||
# Possible values are:
|
# Possible values are:
|
||||||
# invert: use "fn ln" -> "ln, fn" (the original algorithm)
|
# invert: use "fn ln" -> "ln, fn" (the original algorithm)
|
||||||
@ -30,6 +41,20 @@ series_index_auto_increment = 'next'
|
|||||||
# selecting 'manage authors', and pressing 'Recalculate all author sort values'.
|
# selecting 'manage authors', and pressing 'Recalculate all author sort values'.
|
||||||
author_sort_copy_method = 'invert'
|
author_sort_copy_method = 'invert'
|
||||||
|
|
||||||
|
# Set which author field to display in the tags pane (the list of authors,
|
||||||
|
# series, publishers etc on the left hand side). The choices are author and
|
||||||
|
# author_sort. This tweak affects only what is displayed under the authors
|
||||||
|
# category in the tags pane and content server. Please note that if you set this
|
||||||
|
# to author_sort, it is very possible to see duplicate names in the list because
|
||||||
|
# although it is guaranteed that author names are unique, there is no such
|
||||||
|
# guarantee for author_sort values. Showing duplicates won't break anything, but
|
||||||
|
# it could lead to some confusion. When using 'author_sort', the tooltip will
|
||||||
|
# show the author's name.
|
||||||
|
# Examples:
|
||||||
|
# categories_use_field_for_author_name = 'author'
|
||||||
|
# categories_use_field_for_author_name = 'author_sort'
|
||||||
|
categories_use_field_for_author_name = 'author'
|
||||||
|
|
||||||
|
|
||||||
# Set whether boolean custom columns are two- or three-valued.
|
# Set whether boolean custom columns are two- or three-valued.
|
||||||
# Two-values for true booleans
|
# Two-values for true booleans
|
||||||
@ -235,3 +260,9 @@ doubleclick_on_library_view = 'open_viewer'
|
|||||||
# Example: locale_for_sorting = 'fr' -- sort using French rules.
|
# Example: locale_for_sorting = 'fr' -- sort using French rules.
|
||||||
# Example: locale_for_sorting = 'nb' -- sort using Norwegian rules.
|
# Example: locale_for_sorting = 'nb' -- sort using Norwegian rules.
|
||||||
locale_for_sorting = ''
|
locale_for_sorting = ''
|
||||||
|
|
||||||
|
|
||||||
|
# Set whether to use one or two columns for custom metadata when editing
|
||||||
|
# metadata one book at a time. If True, then the fields are laid out using two
|
||||||
|
# columns. If False, one column is used.
|
||||||
|
metadata_single_use_2_cols_for_custom_fields = True
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
BIN
resources/images/edit-cut.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
resources/images/edit-paste.png
Normal file
After Width: | Height: | Size: 4.8 KiB |
BIN
resources/images/edit-redo.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
resources/images/edit-select-all.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
resources/images/edit-undo.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
resources/images/format-fill-color.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
resources/images/format-indent-less.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
resources/images/format-indent-more.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
resources/images/format-justify-center.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
resources/images/format-justify-fill.png
Normal file
After Width: | Height: | Size: 1021 B |
BIN
resources/images/format-justify-left.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
resources/images/format-justify-right.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
resources/images/format-list-ordered.png
Normal file
After Width: | Height: | Size: 4.1 KiB |
BIN
resources/images/format-list-unordered.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
BIN
resources/images/format-text-color.png
Normal file
After Width: | Height: | Size: 5.0 KiB |
BIN
resources/images/format-text-heading.png
Normal file
After Width: | Height: | Size: 965 B |
BIN
resources/images/format-text-subscript.png
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
resources/images/format-text-superscript.png
Normal file
After Width: | Height: | Size: 7.1 KiB |
BIN
resources/images/insert-link.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 11 KiB |
67
resources/recipes/cnd.recipe
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
__license__ = 'GPL v3'
|
||||||
|
__copyright__ = '2010, Derek Liang <Derek.liang.ca @@@at@@@ gmail.com>'
|
||||||
|
'''
|
||||||
|
cnd.org
|
||||||
|
'''
|
||||||
|
import re
|
||||||
|
|
||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
|
class TheCND(BasicNewsRecipe):
|
||||||
|
|
||||||
|
title = 'CND'
|
||||||
|
__author__ = 'Derek Liang'
|
||||||
|
description = ''
|
||||||
|
INDEX = 'http://cnd.org'
|
||||||
|
language = 'zh'
|
||||||
|
conversion_options = {'linearize_tables':True}
|
||||||
|
|
||||||
|
remove_tags_before = dict(name='div', id='articleHead')
|
||||||
|
remove_tags_after = dict(id='copyright')
|
||||||
|
remove_tags = [dict(name='table', attrs={'align':'right'}), dict(name='img', attrs={'src':'http://my.cnd.org/images/logo.gif'}), dict(name='hr', attrs={}), dict(name='small', attrs={})]
|
||||||
|
no_stylesheets = True
|
||||||
|
|
||||||
|
preprocess_regexps = [(re.compile(r'<!--.*?-->', re.DOTALL), lambda m: '')]
|
||||||
|
|
||||||
|
def print_version(self, url):
|
||||||
|
if url.find('news/article.php') >= 0:
|
||||||
|
return re.sub("^[^=]*", "http://my.cnd.org/modules/news/print.php?storyid", url)
|
||||||
|
else:
|
||||||
|
return re.sub("^[^=]*", "http://my.cnd.org/modules/wfsection/print.php?articleid", url)
|
||||||
|
|
||||||
|
def parse_index(self):
|
||||||
|
soup = self.index_to_soup(self.INDEX)
|
||||||
|
|
||||||
|
feeds = []
|
||||||
|
articles = {}
|
||||||
|
|
||||||
|
for a in soup.findAll('a', attrs={'target':'_cnd'}):
|
||||||
|
url = a['href']
|
||||||
|
if url.find('article.php') < 0 :
|
||||||
|
continue
|
||||||
|
if url.startswith('/'):
|
||||||
|
url = 'http://cnd.org'+url
|
||||||
|
title = self.tag_to_string(a)
|
||||||
|
self.log('\tFound article: ', title, 'at', url)
|
||||||
|
date = a.nextSibling
|
||||||
|
if (date is not None) and len(date)>2:
|
||||||
|
if not articles.has_key(date):
|
||||||
|
articles[date] = []
|
||||||
|
articles[date].append({'title':title, 'url':url, 'description': '', 'date':''})
|
||||||
|
self.log('\t\tAppend to : ', date)
|
||||||
|
|
||||||
|
self.log('log articles', articles)
|
||||||
|
mostCurrent = sorted(articles).pop()
|
||||||
|
self.title = 'CND ' + mostCurrent
|
||||||
|
|
||||||
|
feeds.append((self.title, articles[mostCurrent]))
|
||||||
|
|
||||||
|
return feeds
|
||||||
|
|
||||||
|
def populate_article_metadata(self, article, soup, first):
|
||||||
|
header = soup.find('h3')
|
||||||
|
self.log('header: ' + self.tag_to_string(header))
|
||||||
|
pass
|
||||||
|
|
42
resources/recipes/ecotrend.recipe
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
__license__ = 'GPL v3'
|
||||||
|
__copyright__ = '2010, Darko Miletic <darko.miletic at gmail.com>'
|
||||||
|
'''
|
||||||
|
globaleconomicanalysis.blogspot.com
|
||||||
|
'''
|
||||||
|
|
||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
|
class GlobalEconomicAnalysis(BasicNewsRecipe):
|
||||||
|
title = "Mish's Global Economic Trend Analysis"
|
||||||
|
__author__ = 'Darko Miletic'
|
||||||
|
description = 'Thoughts on the global economy, housing, gold, silver, interest rates, oil, energy, China, commodities, the dollar, Euro, Renminbi, Yen, inflation, deflation, stagflation, precious metals, emerging markets, and policy decisions that affect the global markets.'
|
||||||
|
publisher = 'Mike Shedlock'
|
||||||
|
category = 'news, politics, economy, banking'
|
||||||
|
oldest_article = 7
|
||||||
|
max_articles_per_feed = 200
|
||||||
|
no_stylesheets = True
|
||||||
|
encoding = 'utf8'
|
||||||
|
use_embedded_content = True
|
||||||
|
language = 'en'
|
||||||
|
remove_empty_feeds = True
|
||||||
|
publication_type = 'blog'
|
||||||
|
masthead_url = 'http://www.pagina12.com.ar/commons/imgs/logo-home.gif'
|
||||||
|
extra_css = """
|
||||||
|
body{font-family: Arial,Helvetica,sans-serif }
|
||||||
|
img{margin-bottom: 0.4em; display:block}
|
||||||
|
"""
|
||||||
|
|
||||||
|
conversion_options = {
|
||||||
|
'comment' : description
|
||||||
|
, 'tags' : category
|
||||||
|
, 'publisher' : publisher
|
||||||
|
, 'language' : language
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_tags = [
|
||||||
|
dict(name=['meta','link','iframe','object','embed'])
|
||||||
|
,dict(attrs={'class':'blogger-post-footer'})
|
||||||
|
]
|
||||||
|
remove_attributes=['border']
|
||||||
|
|
||||||
|
feeds = [(u'Articles', u'http://feeds2.feedburner.com/MishsGlobalEconomicTrendAnalysis')]
|
@ -40,13 +40,12 @@ class GazetvanAntwerpen(BasicNewsRecipe):
|
|||||||
remove_tags_after = dict(name='span', attrs={'class':'author'})
|
remove_tags_after = dict(name='span', attrs={'class':'author'})
|
||||||
|
|
||||||
feeds = [
|
feeds = [
|
||||||
(u'Overzicht & Blikvanger', u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/overview/overzicht' )
|
(u'Binnenland' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/binnenland' )
|
||||||
|
,(u'Buitenland' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/buitenland' )
|
||||||
,(u'Stad & Regio' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/stadenregio' )
|
,(u'Stad & Regio' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/stadenregio' )
|
||||||
,(u'Economie' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/economie' )
|
,(u'Economie' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/economie' )
|
||||||
,(u'Binnenland' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/binnenland' )
|
|
||||||
,(u'Buitenland' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/buitenland' )
|
|
||||||
,(u'Media & Cultur' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/mediaencultuur')
|
,(u'Media & Cultur' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/mediaencultuur')
|
||||||
,(u'Wetenschap' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/mediaencultuur')
|
,(u'Wetenschap' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/wetenschap' )
|
||||||
,(u'Sport' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/sport' )
|
,(u'Sport' , u'http://www.gva.be/syndicationservices/artfeedservice.svc/rss/mostrecent/sport' )
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1,88 +1,72 @@
|
|||||||
# -*- coding: utf-8 -*-
|
import re
|
||||||
|
|
||||||
from calibre.web.feeds.recipes import BasicNewsRecipe
|
from calibre.web.feeds.recipes import BasicNewsRecipe
|
||||||
|
|
||||||
class JournalofHospitalMedicine(BasicNewsRecipe):
|
class JournalofHospitalMedicine(BasicNewsRecipe):
|
||||||
|
|
||||||
title = 'Journal of Hospital Medicine'
|
title = 'Journal of Hospital Medicine'
|
||||||
__author__ = 'Krittika Goyal'
|
__author__ = 'Kovid Goyal'
|
||||||
description = 'Medical news'
|
description = 'Medical news'
|
||||||
timefmt = ' [%d %b, %Y]'
|
timefmt = ' [%d %b, %Y]'
|
||||||
needs_subscription = True
|
needs_subscription = True
|
||||||
language = 'en'
|
language = 'en'
|
||||||
|
|
||||||
no_stylesheets = True
|
no_stylesheets = True
|
||||||
#remove_tags_before = dict(name='div', attrs={'align':'center'})
|
keep_only_tags = [dict(id=['articleTitle', 'articleMeta', 'fulltext'])]
|
||||||
#remove_tags_after = dict(name='ol', attrs={'compact':'COMPACT'})
|
remove_tags = [dict(attrs={'class':'licensedContent'})]
|
||||||
remove_tags = [
|
|
||||||
dict(name='iframe'),
|
|
||||||
dict(name='div', attrs={'class':'subContent'}),
|
|
||||||
dict(name='div', attrs={'id':['contentFrame']}),
|
|
||||||
#dict(name='form', attrs={'onsubmit':"return verifySearch(this.w,'Keyword, citation, or author')"}),
|
|
||||||
#dict(name='table', attrs={'align':'RIGHT'}),
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# TO LOGIN
|
# TO LOGIN
|
||||||
def get_browser(self):
|
def get_browser(self):
|
||||||
br = BasicNewsRecipe.get_browser()
|
br = BasicNewsRecipe.get_browser()
|
||||||
br.open('http://www3.interscience.wiley.com/cgi-bin/home')
|
br.open('http://www3.interscience.wiley.com/cgi-bin/home')
|
||||||
br.select_form(name='siteLogin')
|
br.select_form(nr=0)
|
||||||
br['LoginName'] = self.username
|
br['j_username'] = self.username
|
||||||
br['Password'] = self.password
|
br['j_password'] = self.password
|
||||||
response = br.submit()
|
response = br.submit()
|
||||||
raw = response.read()
|
raw = response.read()
|
||||||
if 'userName = ""' in raw:
|
if '<h2>LOGGED IN</h2>' not in raw:
|
||||||
raise Exception('Login failed. Check your username and password')
|
raise Exception('Login failed. Check your username and password')
|
||||||
return br
|
return br
|
||||||
|
|
||||||
#TO GET ARTICLE TOC
|
#TO GET ARTICLE TOC
|
||||||
def johm_get_index(self):
|
def johm_get_index(self):
|
||||||
return self.index_to_soup('http://www3.interscience.wiley.com/journal/111081937/home')
|
return self.index_to_soup('http://onlinelibrary.wiley.com/journal/10.1002/(ISSN)1553-5606/currentissue')
|
||||||
|
|
||||||
# To parse artice toc
|
# To parse artice toc
|
||||||
def parse_index(self):
|
def parse_index(self):
|
||||||
parse_soup = self.johm_get_index()
|
soup = self.johm_get_index()
|
||||||
|
toc = soup.find(id='issueTocGroups')
|
||||||
div = parse_soup.find(id='contentCell')
|
|
||||||
|
|
||||||
current_section = None
|
|
||||||
current_articles = []
|
|
||||||
feeds = []
|
feeds = []
|
||||||
for x in div.findAll(True):
|
for group in toc.findAll('li', id=re.compile(r'group\d+')):
|
||||||
if x.name == 'h4':
|
gtitle = group.find(attrs={'class':'subSectionHeading'})
|
||||||
# Section heading found
|
if gtitle is None:
|
||||||
if current_articles and current_section:
|
|
||||||
feeds.append((current_section, current_articles))
|
|
||||||
current_section = self.tag_to_string(x)
|
|
||||||
current_articles = []
|
|
||||||
self.log('\tFound section:', current_section)
|
|
||||||
if current_section is not None and x.name == 'strong':
|
|
||||||
title = self.tag_to_string(x)
|
|
||||||
p = x.parent.parent.find('a', href=lambda x: x and '/HTMLSTART' in x)
|
|
||||||
if p is None:
|
|
||||||
continue
|
continue
|
||||||
url = p.get('href', False)
|
gtitle = self.tag_to_string(gtitle)
|
||||||
if not url or not title:
|
arts = group.find(attrs={'class':'articles'})
|
||||||
|
if arts is None:
|
||||||
continue
|
continue
|
||||||
|
self.log('Found section:', gtitle)
|
||||||
|
articles = []
|
||||||
|
for art in arts.findAll(attrs={'class':lambda x: x and 'tocArticle'
|
||||||
|
in x}):
|
||||||
|
a = art.find('a', href=True)
|
||||||
|
if a is None:
|
||||||
|
continue
|
||||||
|
url = a.get('href')
|
||||||
if url.startswith('/'):
|
if url.startswith('/'):
|
||||||
url = 'http://www3.interscience.wiley.com'+url
|
url = 'http://onlinelibrary.wiley.com' + url
|
||||||
url = url.replace('/HTMLSTART', '/main.html,ftx_abs')
|
url = url.replace('/abstract', '/full')
|
||||||
self.log('\t\tFound article:', title)
|
title = self.tag_to_string(a)
|
||||||
self.log('\t\t\t', url)
|
a.extract()
|
||||||
#if url.startswith('/'):
|
pm = art.find(attrs={'class':'productMenu'})
|
||||||
#url = 'http://online.wsj.com'+url
|
if pm is not None:
|
||||||
current_articles.append({'title': title, 'url':url,
|
pm.extract()
|
||||||
'description':'', 'date':''})
|
desc = self.tag_to_string(art)
|
||||||
|
self.log('\tFound article:', title, 'at', url)
|
||||||
if current_articles and current_section:
|
articles.append({'title':title, 'url':url, 'description':desc,
|
||||||
feeds.append((current_section, current_articles))
|
'date':''})
|
||||||
|
if articles:
|
||||||
|
feeds.append((gtitle, articles))
|
||||||
|
|
||||||
return feeds
|
return feeds
|
||||||
|
|
||||||
def preprocess_html(self, soup):
|
|
||||||
for img in soup.findAll('img', src=True):
|
|
||||||
img['src'] = img['src'].replace('tfig', 'nfig')
|
|
||||||
return soup
|
|
||||||
|
|
||||||
|
@ -78,4 +78,6 @@ class Lanacion(BasicNewsRecipe):
|
|||||||
]
|
]
|
||||||
|
|
||||||
def preprocess_html(self, soup):
|
def preprocess_html(self, soup):
|
||||||
|
for item in soup.findAll(style=True):
|
||||||
|
del item['style']
|
||||||
return self.adeify_images(soup)
|
return self.adeify_images(soup)
|
||||||
|
@ -4,23 +4,14 @@ from calibre.web.feeds.recipes import BasicNewsRecipe
|
|||||||
class NYTimes(BasicNewsRecipe):
|
class NYTimes(BasicNewsRecipe):
|
||||||
|
|
||||||
title = 'New England Journal of Medicine'
|
title = 'New England Journal of Medicine'
|
||||||
__author__ = 'Krittika Goyal'
|
__author__ = 'Kovid Goyal'
|
||||||
description = 'Medical news'
|
description = 'Medical news'
|
||||||
timefmt = ' [%d %b, %Y]'
|
timefmt = ' [%d %b, %Y]'
|
||||||
needs_subscription = True
|
needs_subscription = True
|
||||||
language = 'en'
|
language = 'en'
|
||||||
|
|
||||||
no_stylesheets = True
|
no_stylesheets = True
|
||||||
remove_tags_before = dict(name='div', attrs={'align':'center'})
|
keep_only_tags = dict(id='content')
|
||||||
remove_tags_after = dict(name='ol', attrs={'compact':'COMPACT'})
|
|
||||||
remove_tags = [
|
|
||||||
dict(name='iframe'),
|
|
||||||
#dict(name='div', attrs={'class':'related-articles'}),
|
|
||||||
dict(name='div', attrs={'id':['sidebar']}),
|
|
||||||
#dict(name='form', attrs={'onsubmit':"return verifySearch(this.w,'Keyword, citation, or author')"}),
|
|
||||||
dict(name='table', attrs={'align':'RIGHT'}),
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#TO LOGIN
|
#TO LOGIN
|
||||||
@ -44,55 +35,44 @@ class NYTimes(BasicNewsRecipe):
|
|||||||
def parse_index(self):
|
def parse_index(self):
|
||||||
parse_soup = self.nejm_get_index()
|
parse_soup = self.nejm_get_index()
|
||||||
|
|
||||||
div = parse_soup.find(id='centerTOC')
|
|
||||||
|
|
||||||
current_section = None
|
|
||||||
current_articles = []
|
|
||||||
feeds = []
|
feeds = []
|
||||||
for x in div.findAll(True):
|
|
||||||
if x.name == 'img' and '/toc/' in x.get('src', '') and 'uarrow.gif' not in x.get('src', ''):
|
div = parse_soup.find(attrs={'class':'tocContent'})
|
||||||
# Section heading found
|
for group in div.findAll(attrs={'class':'articleGrouping'}):
|
||||||
if current_articles and current_section and 'Week in the' not in current_section:
|
feed_title = group.find(attrs={'class':'articleType'})
|
||||||
feeds.append((current_section, current_articles))
|
if feed_title is None:
|
||||||
current_section = x.get('alt')
|
continue
|
||||||
current_articles = []
|
feed_title = self.tag_to_string(feed_title)
|
||||||
self.log('\tFound section:', current_section)
|
articles = []
|
||||||
if current_section is not None and x.name == 'strong':
|
self.log('Found section:', feed_title)
|
||||||
title = self.tag_to_string(x)
|
for art in group.findAll(attrs={'class':lambda x: x and 'articleEntry'
|
||||||
a = x.parent.find('a', href=lambda x: x and '/full/' in x)
|
in x}):
|
||||||
|
link = art.find(attrs={'class':lambda x:x and 'articleLink' in
|
||||||
|
x})
|
||||||
|
if link is None:
|
||||||
|
continue
|
||||||
|
a = link.find('a', href=True)
|
||||||
if a is None:
|
if a is None:
|
||||||
continue
|
continue
|
||||||
url = a.get('href', False)
|
url = a.get('href')
|
||||||
if not url or not title:
|
|
||||||
continue
|
|
||||||
if url.startswith('/'):
|
if url.startswith('/'):
|
||||||
url = 'http://content.nejm.org'+url
|
url = 'http://www.nejm.org'+url
|
||||||
self.log('\t\tFound article:', title)
|
title = self.tag_to_string(a)
|
||||||
self.log('\t\t\t', url)
|
self.log.info('\tFound article:', title, 'at', url)
|
||||||
if url.startswith('/'):
|
article = {'title':title, 'url':url, 'date':''}
|
||||||
url = 'http://online.wsj.com'+url
|
au = art.find(attrs={'class':'articleAuthors'})
|
||||||
current_articles.append({'title': title, 'url':url,
|
if au is not None:
|
||||||
'description':'', 'date':''})
|
article['author'] = self.tag_to_string(au)
|
||||||
|
desc = art.find(attrs={'class':'hover_text'})
|
||||||
if current_articles and current_section:
|
if desc is not None:
|
||||||
feeds.append((current_section, current_articles))
|
desc = self.tag_to_string(desc)
|
||||||
|
if 'author' in article:
|
||||||
|
desc = ' by ' + article['author'] + ' ' +desc
|
||||||
|
article['description'] = desc
|
||||||
|
articles.append(article)
|
||||||
|
if articles:
|
||||||
|
feeds.append((feed_title, articles))
|
||||||
|
|
||||||
return feeds
|
return feeds
|
||||||
|
|
||||||
def preprocess_html(self, soup):
|
|
||||||
for a in soup.findAll(text=lambda x: x and '[in this window]' in x):
|
|
||||||
a = a.findParent('a')
|
|
||||||
url = a.get('href', None)
|
|
||||||
if not url:
|
|
||||||
continue
|
|
||||||
if url.startswith('/'):
|
|
||||||
url = 'http://content.nejm.org'+url
|
|
||||||
isoup = self.index_to_soup(url)
|
|
||||||
img = isoup.find('img', src=lambda x: x and
|
|
||||||
x.startswith('/content/'))
|
|
||||||
if img is not None:
|
|
||||||
img.extract()
|
|
||||||
table = a.findParent('table')
|
|
||||||
table.replaceWith(img)
|
|
||||||
return soup
|
|
||||||
|
|
||||||
|
62
resources/recipes/wenxuecity-znjy.recipe
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
__license__ = 'GPL v3'
|
||||||
|
__copyright__ = '2010, Derek Liang <Derek.liang.ca @@@at@@@ gmail.com>'
|
||||||
|
'''
|
||||||
|
wenxuecity.com
|
||||||
|
'''
|
||||||
|
import re
|
||||||
|
|
||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
|
class TheCND(BasicNewsRecipe):
|
||||||
|
|
||||||
|
title = 'wenxuecity - znjy'
|
||||||
|
__author__ = 'Derek Liang'
|
||||||
|
description = ''
|
||||||
|
INDEX = 'http://bbs.wenxuecity.com/znjy/?elite=1'
|
||||||
|
language = 'zh'
|
||||||
|
conversion_options = {'linearize_tables':True}
|
||||||
|
|
||||||
|
remove_tags_before = dict(name='div', id='message')
|
||||||
|
remove_tags_after = dict(name='div', id='message')
|
||||||
|
remove_tags = [dict(name='div', id='postmeta'), dict(name='div', id='footer')]
|
||||||
|
no_stylesheets = True
|
||||||
|
|
||||||
|
preprocess_regexps = [(re.compile(r'<!--.*?-->', re.DOTALL), lambda m: '')]
|
||||||
|
|
||||||
|
def print_version(self, url):
|
||||||
|
return url + '?print'
|
||||||
|
|
||||||
|
def parse_index(self):
|
||||||
|
soup = self.index_to_soup(self.INDEX)
|
||||||
|
|
||||||
|
feeds = []
|
||||||
|
articles = {}
|
||||||
|
|
||||||
|
for a in soup.findAll('a', attrs={'class':'post'}):
|
||||||
|
url = a['href']
|
||||||
|
if url.startswith('/'):
|
||||||
|
url = 'http://bbs.wenxuecity.com'+url
|
||||||
|
title = self.tag_to_string(a)
|
||||||
|
self.log('\tFound article: ', title, ' at:', url)
|
||||||
|
dateReg = re.search( '(\d\d?)/(\d\d?)/(\d\d)', self.tag_to_string(a.parent) )
|
||||||
|
date = '%(y)s/%(m)02d/%(d)02d' % {'y' : dateReg.group(3), 'm' : int(dateReg.group(1)), 'd' : int(dateReg.group(2)) }
|
||||||
|
if not articles.has_key(date):
|
||||||
|
articles[date] = []
|
||||||
|
articles[date].append({'title':title, 'url':url, 'description': '', 'date':''})
|
||||||
|
self.log('\t\tAppend to : ', date)
|
||||||
|
|
||||||
|
self.log('log articles', articles)
|
||||||
|
mostCurrent = sorted(articles).pop()
|
||||||
|
self.title = '文学城 - 子女教育 - ' + mostCurrent
|
||||||
|
|
||||||
|
feeds.append((self.title, articles[mostCurrent]))
|
||||||
|
|
||||||
|
return feeds
|
||||||
|
|
||||||
|
def populate_article_metadata(self, article, soup, first):
|
||||||
|
header = soup.find('h3')
|
||||||
|
self.log('header: ' + self.tag_to_string(header))
|
||||||
|
pass
|
||||||
|
|
@ -318,7 +318,11 @@ class LinuxFreeze(Command):
|
|||||||
import codecs
|
import codecs
|
||||||
|
|
||||||
def set_default_encoding():
|
def set_default_encoding():
|
||||||
|
try:
|
||||||
locale.setlocale(locale.LC_ALL, '')
|
locale.setlocale(locale.LC_ALL, '')
|
||||||
|
except:
|
||||||
|
print 'WARNING: Failed to set default libc locale, using en_US.UTF-8'
|
||||||
|
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
|
||||||
enc = locale.getdefaultlocale()[1]
|
enc = locale.getdefaultlocale()[1]
|
||||||
if not enc:
|
if not enc:
|
||||||
enc = locale.nl_langinfo(locale.CODESET)
|
enc = locale.nl_langinfo(locale.CODESET)
|
||||||
|
@ -36,6 +36,16 @@ Install BeautifulSoup 3.0.x manually into site-packages (3.1.x parses broken HTM
|
|||||||
|
|
||||||
Install pywin32 and edit win32com\__init__.py setting _frozen = True and
|
Install pywin32 and edit win32com\__init__.py setting _frozen = True and
|
||||||
__gen_path__ to a temp dir (otherwise it tries to set it to a dir in the install tree which leads to permission errors)
|
__gen_path__ to a temp dir (otherwise it tries to set it to a dir in the install tree which leads to permission errors)
|
||||||
|
Note that you should use::
|
||||||
|
|
||||||
|
import tempfile
|
||||||
|
__gen_path__ = os.path.join(
|
||||||
|
tempfile.gettempdir(), "gen_py",
|
||||||
|
"%d.%d" % (sys.version_info[0], sys.version_info[1]))
|
||||||
|
|
||||||
|
Use gettempdir instead of the win32 api method as gettempdir returns a temp dir that is guaranteed to actually work.
|
||||||
|
|
||||||
|
|
||||||
Also edit win32com\client\gencache.py and change the except IOError on line 57 to catch all exceptions.
|
Also edit win32com\client\gencache.py and change the except IOError on line 57 to catch all exceptions.
|
||||||
|
|
||||||
SQLite
|
SQLite
|
||||||
|
@ -2,7 +2,7 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
|
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
__appname__ = 'calibre'
|
__appname__ = 'calibre'
|
||||||
__version__ = '0.7.33'
|
__version__ = '0.7.34'
|
||||||
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
|
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
@ -24,11 +24,11 @@ class ANDROID(USBMS):
|
|||||||
0xc92 : [0x100], 0xc97: [0x226]},
|
0xc92 : [0x100], 0xc97: [0x226]},
|
||||||
|
|
||||||
# Eken
|
# Eken
|
||||||
0x040d : { 0x8510 : [0x0001] },
|
0x040d : { 0x8510 : [0x0001], 0x0851 : [0x1] },
|
||||||
|
|
||||||
# Motorola
|
# Motorola
|
||||||
0x22b8 : { 0x41d9 : [0x216], 0x2d67 : [0x100], 0x41db : [0x216],
|
0x22b8 : { 0x41d9 : [0x216], 0x2d67 : [0x100], 0x41db : [0x216],
|
||||||
0x4285 : [0x216]},
|
0x4285 : [0x216], 0x42a3 : [0x216] },
|
||||||
|
|
||||||
# Sony Ericsson
|
# Sony Ericsson
|
||||||
0xfce : { 0xd12e : [0x0100]},
|
0xfce : { 0xd12e : [0x0100]},
|
||||||
@ -49,8 +49,9 @@ class ANDROID(USBMS):
|
|||||||
# Dell
|
# Dell
|
||||||
0x413c : { 0xb007 : [0x0100, 0x0224]},
|
0x413c : { 0xb007 : [0x0100, 0x0224]},
|
||||||
|
|
||||||
# Eken?
|
# LG
|
||||||
0x040d : { 0x0851 : [0x0001]},
|
0x1004 : { 0x61cc : [0x100] },
|
||||||
|
|
||||||
}
|
}
|
||||||
EBOOK_DIR_MAIN = ['eBooks/import', 'wordplayer/calibretransfer', 'Books']
|
EBOOK_DIR_MAIN = ['eBooks/import', 'wordplayer/calibretransfer', 'Books']
|
||||||
EXTRA_CUSTOMIZATION_MESSAGE = _('Comma separated list of directories to '
|
EXTRA_CUSTOMIZATION_MESSAGE = _('Comma separated list of directories to '
|
||||||
@ -59,13 +60,13 @@ class ANDROID(USBMS):
|
|||||||
EXTRA_CUSTOMIZATION_DEFAULT = ', '.join(EBOOK_DIR_MAIN)
|
EXTRA_CUSTOMIZATION_DEFAULT = ', '.join(EBOOK_DIR_MAIN)
|
||||||
|
|
||||||
VENDOR_NAME = ['HTC', 'MOTOROLA', 'GOOGLE_', 'ANDROID', 'ACER',
|
VENDOR_NAME = ['HTC', 'MOTOROLA', 'GOOGLE_', 'ANDROID', 'ACER',
|
||||||
'GT-I5700', 'SAMSUNG', 'DELL', 'LINUX']
|
'GT-I5700', 'SAMSUNG', 'DELL', 'LINUX', 'GOOGLE']
|
||||||
WINDOWS_MAIN_MEM = ['ANDROID_PHONE', 'A855', 'A853', 'INC.NEXUS_ONE',
|
WINDOWS_MAIN_MEM = ['ANDROID_PHONE', 'A855', 'A853', 'INC.NEXUS_ONE',
|
||||||
'__UMS_COMPOSITE', '_MB200', 'MASS_STORAGE', '_-_CARD', 'SGH-I897',
|
'__UMS_COMPOSITE', '_MB200', 'MASS_STORAGE', '_-_CARD', 'SGH-I897',
|
||||||
'GT-I9000', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID',
|
'GT-I9000', 'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID',
|
||||||
'SCH-I500_CARD', 'SPH-D700_CARD', 'MB810']
|
'SCH-I500_CARD', 'SPH-D700_CARD', 'MB810', 'GT-P1000']
|
||||||
WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'GT-I9000_CARD', 'SGH-I897',
|
WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'GT-I9000_CARD', 'SGH-I897',
|
||||||
'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID']
|
'FILE-STOR_GADGET', 'SGH-T959', 'SAMSUNG_ANDROID', 'GT-P1000_CARD']
|
||||||
|
|
||||||
OSX_MAIN_MEM = 'HTC Android Phone Media'
|
OSX_MAIN_MEM = 'HTC Android Phone Media'
|
||||||
|
|
||||||
|
@ -266,3 +266,12 @@ class POCKETBOOK701(USBMS):
|
|||||||
VENDOR_NAME = 'ANDROID'
|
VENDOR_NAME = 'ANDROID'
|
||||||
WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = '__UMS_COMPOSITE'
|
WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = '__UMS_COMPOSITE'
|
||||||
|
|
||||||
|
def windows_sort_drives(self, drives):
|
||||||
|
if len(drives) < 2: return drives
|
||||||
|
main = drives.get('main', None)
|
||||||
|
carda = drives.get('carda', None)
|
||||||
|
if main and carda:
|
||||||
|
drives['main'] = carda
|
||||||
|
drives['carda'] = main
|
||||||
|
return drives
|
||||||
|
|
||||||
|
@ -62,9 +62,9 @@ class SWEEX(USBMS):
|
|||||||
# Ordered list of supported formats
|
# Ordered list of supported formats
|
||||||
FORMATS = ['epub', 'prc', 'fb2', 'html', 'rtf', 'chm', 'pdf', 'txt']
|
FORMATS = ['epub', 'prc', 'fb2', 'html', 'rtf', 'chm', 'pdf', 'txt']
|
||||||
|
|
||||||
VENDOR_ID = [0x0525]
|
VENDOR_ID = [0x0525, 0x177f]
|
||||||
PRODUCT_ID = [0xa4a5]
|
PRODUCT_ID = [0xa4a5, 0x300]
|
||||||
BCD = [0x0319]
|
BCD = [0x0319, 0x110]
|
||||||
|
|
||||||
VENDOR_NAME = 'SWEEX'
|
VENDOR_NAME = 'SWEEX'
|
||||||
WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = 'EBOOKREADER'
|
WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = 'EBOOKREADER'
|
||||||
@ -104,7 +104,7 @@ class PDNOVEL(USBMS):
|
|||||||
|
|
||||||
VENDOR_NAME = 'ANDROID'
|
VENDOR_NAME = 'ANDROID'
|
||||||
WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = '__UMS_COMPOSITE'
|
WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = '__UMS_COMPOSITE'
|
||||||
THUMBNAIL_HEIGHT = 144
|
THUMBNAIL_HEIGHT = 130
|
||||||
|
|
||||||
EBOOK_DIR_MAIN = 'eBooks'
|
EBOOK_DIR_MAIN = 'eBooks'
|
||||||
SUPPORTS_SUB_DIRS = False
|
SUPPORTS_SUB_DIRS = False
|
||||||
|
@ -605,8 +605,9 @@ class Device(DeviceConfig, DevicePlugin):
|
|||||||
|
|
||||||
main, carda, cardb = self.find_device_nodes()
|
main, carda, cardb = self.find_device_nodes()
|
||||||
if main is None:
|
if main is None:
|
||||||
raise DeviceError(_('Unable to detect the %s disk drive. Your '
|
raise DeviceError(_('Unable to detect the %s disk drive. Either '
|
||||||
' kernel is probably exporting a deprecated version of SYSFS.')
|
'the device has already been ejected, or your '
|
||||||
|
'kernel is exporting a deprecated version of SYSFS.')
|
||||||
%self.__class__.__name__)
|
%self.__class__.__name__)
|
||||||
|
|
||||||
self._linux_mount_map = {}
|
self._linux_mount_map = {}
|
||||||
|
@ -27,13 +27,10 @@ class FB2MLizer(object):
|
|||||||
'''
|
'''
|
||||||
Todo: * Include more FB2 specific tags in the conversion.
|
Todo: * Include more FB2 specific tags in the conversion.
|
||||||
* Handle a tags.
|
* Handle a tags.
|
||||||
* Figure out some way to turn oeb_book.toc items into <section><title>
|
|
||||||
<p> to allow for readers to generate toc from the document.
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def __init__(self, log):
|
def __init__(self, log):
|
||||||
self.log = log
|
self.log = log
|
||||||
self.image_hrefs = {}
|
|
||||||
self.reset_state()
|
self.reset_state()
|
||||||
|
|
||||||
def reset_state(self):
|
def reset_state(self):
|
||||||
@ -43,17 +40,25 @@ class FB2MLizer(object):
|
|||||||
# in different directories. FB2 images are all in a flat layout so we rename all images
|
# in different directories. FB2 images are all in a flat layout so we rename all images
|
||||||
# into a sequential numbering system to ensure there are no collisions between image names.
|
# into a sequential numbering system to ensure there are no collisions between image names.
|
||||||
self.image_hrefs = {}
|
self.image_hrefs = {}
|
||||||
|
# Mapping of toc items and their
|
||||||
|
self.toc = {}
|
||||||
|
# Used to see whether a new <section> needs to be opened
|
||||||
|
self.section_level = 0
|
||||||
|
|
||||||
def extract_content(self, oeb_book, opts):
|
def extract_content(self, oeb_book, opts):
|
||||||
self.log.info('Converting XHTML to FB2 markup...')
|
self.log.info('Converting XHTML to FB2 markup...')
|
||||||
self.oeb_book = oeb_book
|
self.oeb_book = oeb_book
|
||||||
self.opts = opts
|
self.opts = opts
|
||||||
|
self.reset_state()
|
||||||
|
|
||||||
|
# Used for adding <section>s and <title>s to allow readers
|
||||||
|
# to generate toc from the document.
|
||||||
|
if self.opts.sectionize == 'toc':
|
||||||
|
self.create_flat_toc(self.oeb_book.toc, 1)
|
||||||
|
|
||||||
return self.fb2mlize_spine()
|
return self.fb2mlize_spine()
|
||||||
|
|
||||||
def fb2mlize_spine(self):
|
def fb2mlize_spine(self):
|
||||||
self.reset_state()
|
|
||||||
|
|
||||||
output = [self.fb2_header()]
|
output = [self.fb2_header()]
|
||||||
output.append(self.get_text())
|
output.append(self.get_text())
|
||||||
output.append(self.fb2mlize_images())
|
output.append(self.fb2mlize_images())
|
||||||
@ -66,13 +71,19 @@ class FB2MLizer(object):
|
|||||||
return u'<?xml version="1.0" encoding="UTF-8"?>' + output
|
return u'<?xml version="1.0" encoding="UTF-8"?>' + output
|
||||||
|
|
||||||
def clean_text(self, text):
|
def clean_text(self, text):
|
||||||
text = re.sub(r'(?miu)<section>\s*</section>', '', text)
|
|
||||||
text = re.sub(r'(?miu)\s+</section>', '</section>', text)
|
|
||||||
text = re.sub(r'(?miu)</section><section>', '</section>\n\n<section>', text)
|
|
||||||
|
|
||||||
text = re.sub(r'(?miu)<p>\s*</p>', '', text)
|
text = re.sub(r'(?miu)<p>\s*</p>', '', text)
|
||||||
text = re.sub(r'(?miu)\s+</p>', '</p>', text)
|
text = re.sub(r'(?miu)\s*</p>', '</p>', text)
|
||||||
text = re.sub(r'(?miu)</p><p>', '</p>\n\n<p>', text)
|
text = re.sub(r'(?miu)</p>\s*<p>', '</p>\n\n<p>', text)
|
||||||
|
|
||||||
|
text = re.sub(r'(?miu)<title>\s*</title>', '', text)
|
||||||
|
text = re.sub(r'(?miu)\s+</title>', '</title>', text)
|
||||||
|
|
||||||
|
text = re.sub(r'(?miu)<section>\s*</section>', '', text)
|
||||||
|
text = re.sub(r'(?miu)\s*</section>', '\n</section>', text)
|
||||||
|
text = re.sub(r'(?miu)</section>\s*', '</section>\n\n', text)
|
||||||
|
text = re.sub(r'(?miu)\s*<section>', '\n<section>', text)
|
||||||
|
text = re.sub(r'(?miu)<section>\s*', '<section>\n', text)
|
||||||
|
text = re.sub(r'(?miu)</section><section>', '</section>\n\n<section>', text)
|
||||||
|
|
||||||
if self.opts.insert_blank_line:
|
if self.opts.insert_blank_line:
|
||||||
text = re.sub(r'(?miu)</p>', '</p><empty-line />', text)
|
text = re.sub(r'(?miu)</p>', '</p><empty-line />', text)
|
||||||
@ -144,12 +155,34 @@ class FB2MLizer(object):
|
|||||||
|
|
||||||
def get_text(self):
|
def get_text(self):
|
||||||
text = ['<body>']
|
text = ['<body>']
|
||||||
|
|
||||||
|
# Create main section if there are no others to create
|
||||||
|
if self.opts.sectionize == 'nothing':
|
||||||
|
text.append('<section>')
|
||||||
|
self.section_level += 1
|
||||||
|
|
||||||
for item in self.oeb_book.spine:
|
for item in self.oeb_book.spine:
|
||||||
self.log.debug('Converting %s to FictionBook2 XML' % item.href)
|
self.log.debug('Converting %s to FictionBook2 XML' % item.href)
|
||||||
stylizer = Stylizer(item.data, item.href, self.oeb_book, self.opts, self.opts.output_profile)
|
stylizer = Stylizer(item.data, item.href, self.oeb_book, self.opts, self.opts.output_profile)
|
||||||
|
|
||||||
|
# Start a <section> if we must sectionize each file or if the TOC references this page
|
||||||
|
page_section_open = False
|
||||||
|
if self.opts.sectionize == 'files' or self.toc.get(item.href) == 'page':
|
||||||
text.append('<section>')
|
text.append('<section>')
|
||||||
|
page_section_open = True
|
||||||
|
self.section_level += 1
|
||||||
|
|
||||||
text += self.dump_text(item.data.find(XHTML('body')), stylizer, item)
|
text += self.dump_text(item.data.find(XHTML('body')), stylizer, item)
|
||||||
|
|
||||||
|
if page_section_open:
|
||||||
text.append('</section>')
|
text.append('</section>')
|
||||||
|
self.section_level -= 1
|
||||||
|
|
||||||
|
# Close any open sections
|
||||||
|
while self.section_level > 0:
|
||||||
|
text.append('</section>')
|
||||||
|
self.section_level -= 1
|
||||||
|
|
||||||
return ''.join(text) + '</body>'
|
return ''.join(text) + '</body>'
|
||||||
|
|
||||||
def fb2mlize_images(self):
|
def fb2mlize_images(self):
|
||||||
@ -184,6 +217,17 @@ class FB2MLizer(object):
|
|||||||
'%s.' % (item.href, e))
|
'%s.' % (item.href, e))
|
||||||
return ''.join(images)
|
return ''.join(images)
|
||||||
|
|
||||||
|
def create_flat_toc(self, nodes, level):
|
||||||
|
for item in nodes:
|
||||||
|
href, mid, id = item.href.partition('#')
|
||||||
|
if not id:
|
||||||
|
self.toc[href] = 'page'
|
||||||
|
else:
|
||||||
|
if not self.toc.get(href, None):
|
||||||
|
self.toc[href] = {}
|
||||||
|
self.toc[href][id] = level
|
||||||
|
self.create_flat_toc(item.nodes, level + 1)
|
||||||
|
|
||||||
def ensure_p(self):
|
def ensure_p(self):
|
||||||
if self.in_p:
|
if self.in_p:
|
||||||
return [], []
|
return [], []
|
||||||
@ -254,10 +298,38 @@ class FB2MLizer(object):
|
|||||||
# First tag in tree
|
# First tag in tree
|
||||||
tag = barename(elem_tree.tag)
|
tag = barename(elem_tree.tag)
|
||||||
|
|
||||||
# Process the XHTML tag if it needs to be converted to an FB2 tag.
|
# Convert TOC entries to <title>s and add <section>s
|
||||||
if tag == 'h1' and self.opts.h1_to_title or tag == 'h2' and self.opts.h2_to_title or tag == 'h3' and self.opts.h3_to_title:
|
if self.opts.sectionize == 'toc':
|
||||||
|
# A section cannot be a child of any other element than another section,
|
||||||
|
# so leave the tag alone if there are parents
|
||||||
|
if not tag_stack:
|
||||||
|
# There are two reasons to start a new section here: the TOC pointed to
|
||||||
|
# this page (then we use the first non-<body> on the page as a <title>), or
|
||||||
|
# the TOC pointed to a specific element
|
||||||
|
newlevel = 0
|
||||||
|
toc_entry = self.toc.get(page.href, None)
|
||||||
|
if toc_entry == 'page':
|
||||||
|
if tag != 'body' and hasattr(elem_tree, 'text') and elem_tree.text:
|
||||||
|
newlevel = 1
|
||||||
|
self.toc[page.href] = None
|
||||||
|
elif toc_entry and elem_tree.attrib.get('id', None):
|
||||||
|
newlevel = toc_entry.get(elem_tree.attrib.get('id', None), None)
|
||||||
|
|
||||||
|
# Start a new section if necessary
|
||||||
|
if newlevel:
|
||||||
|
if not (newlevel > self.section_level):
|
||||||
|
fb2_out.append('</section>')
|
||||||
|
self.section_level -= 1
|
||||||
|
fb2_out.append('<section>')
|
||||||
|
self.section_level += 1
|
||||||
fb2_out.append('<title>')
|
fb2_out.append('<title>')
|
||||||
tags.append('title')
|
tags.append('title')
|
||||||
|
if self.section_level == 0:
|
||||||
|
# If none of the prior processing made a section, make one now to be FB2 spec compliant
|
||||||
|
fb2_out.append('<section>')
|
||||||
|
self.section_level += 1
|
||||||
|
|
||||||
|
# Process the XHTML tag if it needs to be converted to an FB2 tag.
|
||||||
if tag == 'img':
|
if tag == 'img':
|
||||||
if elem_tree.attrib.get('src', None):
|
if elem_tree.attrib.get('src', None):
|
||||||
# Only write the image tag if it is in the manifest.
|
# Only write the image tag if it is in the manifest.
|
||||||
|
@ -16,15 +16,15 @@ class FB2Output(OutputFormatPlugin):
|
|||||||
file_type = 'fb2'
|
file_type = 'fb2'
|
||||||
|
|
||||||
options = set([
|
options = set([
|
||||||
OptionRecommendation(name='h1_to_title',
|
OptionRecommendation(name='sectionize',
|
||||||
recommended_value=False, level=OptionRecommendation.LOW,
|
recommended_value='files', level=OptionRecommendation.LOW,
|
||||||
help=_('Wrap all h1 tags with fb2 title elements.')),
|
choices=['toc', 'files', 'nothing'],
|
||||||
OptionRecommendation(name='h2_to_title',
|
help=_('Specify the sectionization of elements. '
|
||||||
recommended_value=False, level=OptionRecommendation.LOW,
|
'A value of "nothing" turns the book into a single section. '
|
||||||
help=_('Wrap all h2 tags with fb2 title elements.')),
|
'A value of "files" turns each file into a separate section; use this if your device is having trouble. '
|
||||||
OptionRecommendation(name='h3_to_title',
|
'A value of "Table of Contents" turns the entries in the Table of Contents into titles and creates sections; '
|
||||||
recommended_value=False, level=OptionRecommendation.LOW,
|
'if it fails, adjust the "Structure Detection" and/or "Table of Contents" settings '
|
||||||
help=_('Wrap all h3 tags with fb2 title elements.')),
|
'(turn on "Force use of auto-generated Table of Contents).')),
|
||||||
])
|
])
|
||||||
|
|
||||||
def convert(self, oeb_book, output_path, input_plugin, opts, log):
|
def convert(self, oeb_book, output_path, input_plugin, opts, log):
|
||||||
|
@ -57,6 +57,8 @@ _ignore_starts = u'\'"'+u''.join(unichr(x) for x in range(0x2018, 0x201e)+[0x203
|
|||||||
|
|
||||||
def title_sort(title):
|
def title_sort(title):
|
||||||
title = title.strip()
|
title = title.strip()
|
||||||
|
if tweaks['title_series_sorting'] == 'strictly_alphabetic':
|
||||||
|
return title
|
||||||
if title and title[0] in _ignore_starts:
|
if title and title[0] in _ignore_starts:
|
||||||
title = title[1:]
|
title = title[1:]
|
||||||
match = _title_pat.search(title)
|
match = _title_pat.search(title)
|
||||||
|
@ -463,6 +463,8 @@ class Metadata(object):
|
|||||||
other_lang = getattr(other, 'language', None)
|
other_lang = getattr(other, 'language', None)
|
||||||
if other_lang and other_lang.lower() != 'und':
|
if other_lang and other_lang.lower() != 'und':
|
||||||
self.language = other_lang
|
self.language = other_lang
|
||||||
|
if not getattr(self, 'series', None):
|
||||||
|
self.series_index = None
|
||||||
|
|
||||||
def format_series_index(self, val=None):
|
def format_series_index(self, val=None):
|
||||||
from calibre.ebooks.metadata import fmt_sidx
|
from calibre.ebooks.metadata import fmt_sidx
|
||||||
|
@ -257,7 +257,6 @@ class EbookIterator(object):
|
|||||||
s.max_page = s.start_page + s.pages - 1
|
s.max_page = s.start_page + s.pages - 1
|
||||||
self.toc = self.opf.toc
|
self.toc = self.opf.toc
|
||||||
|
|
||||||
self.find_embedded_fonts()
|
|
||||||
self.read_bookmarks()
|
self.read_bookmarks()
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
@ -245,7 +245,7 @@ class RTFInput(InputFormatPlugin):
|
|||||||
from calibre.ebooks.metadata.meta import get_metadata
|
from calibre.ebooks.metadata.meta import get_metadata
|
||||||
from calibre.ebooks.metadata.opf2 import OPFCreator
|
from calibre.ebooks.metadata.opf2 import OPFCreator
|
||||||
from calibre.ebooks.rtf2xml.ParseRtf import RtfInvalidCodeException
|
from calibre.ebooks.rtf2xml.ParseRtf import RtfInvalidCodeException
|
||||||
self.options = options
|
self.opts = options
|
||||||
self.log = log
|
self.log = log
|
||||||
self.log('Converting RTF to XML...')
|
self.log('Converting RTF to XML...')
|
||||||
#Name of the preprocesssed RTF file
|
#Name of the preprocesssed RTF file
|
||||||
@ -290,12 +290,12 @@ class RTFInput(InputFormatPlugin):
|
|||||||
res = transform.tostring(result)
|
res = transform.tostring(result)
|
||||||
res = res[:100].replace('xmlns:html', 'xmlns') + res[100:]
|
res = res[:100].replace('xmlns:html', 'xmlns') + res[100:]
|
||||||
# Replace newlines inserted by the 'empty_paragraphs' option in rtf2xml with html blank lines
|
# Replace newlines inserted by the 'empty_paragraphs' option in rtf2xml with html blank lines
|
||||||
if not getattr(self.options, 'remove_paragraph_spacing', False):
|
if not getattr(self.opts, 'remove_paragraph_spacing', False):
|
||||||
res = re.sub('\s*<body>', '<body>', res)
|
res = re.sub('\s*<body>', '<body>', res)
|
||||||
res = re.sub('(?<=\n)\n{2}',
|
res = re.sub('(?<=\n)\n{2}',
|
||||||
u'<p>\u00a0</p>\n'.encode('utf-8'), res)
|
u'<p>\u00a0</p>\n'.encode('utf-8'), res)
|
||||||
if self.options.preprocess_html:
|
if self.opts.preprocess_html:
|
||||||
preprocessor = PreProcessor(self.options, log=getattr(self, 'log', None))
|
preprocessor = PreProcessor(self.opts, log=getattr(self, 'log', None))
|
||||||
res = preprocessor(res)
|
res = preprocessor(res)
|
||||||
f.write(res)
|
f.write(res)
|
||||||
self.write_inline_css(inline_class, border_styles)
|
self.write_inline_css(inline_class, border_styles)
|
||||||
|
@ -12,6 +12,7 @@ from PyQt4.Qt import QMenu, QObject, QTimer
|
|||||||
from calibre.gui2 import error_dialog
|
from calibre.gui2 import error_dialog
|
||||||
from calibre.gui2.dialogs.delete_matching_from_device import DeleteMatchingFromDeviceDialog
|
from calibre.gui2.dialogs.delete_matching_from_device import DeleteMatchingFromDeviceDialog
|
||||||
from calibre.gui2.dialogs.confirm_delete import confirm
|
from calibre.gui2.dialogs.confirm_delete import confirm
|
||||||
|
from calibre.gui2.dialogs.confirm_delete_location import confirm_location
|
||||||
from calibre.gui2.actions import InterfaceAction
|
from calibre.gui2.actions import InterfaceAction
|
||||||
|
|
||||||
single_shot = partial(QTimer.singleShot, 10)
|
single_shot = partial(QTimer.singleShot, 10)
|
||||||
@ -96,10 +97,15 @@ class DeleteAction(InterfaceAction):
|
|||||||
for action in list(self.delete_menu.actions())[1:]:
|
for action in list(self.delete_menu.actions())[1:]:
|
||||||
action.setEnabled(enabled)
|
action.setEnabled(enabled)
|
||||||
|
|
||||||
def _get_selected_formats(self, msg):
|
def _get_selected_formats(self, msg, ids):
|
||||||
from calibre.gui2.dialogs.select_formats import SelectFormats
|
from calibre.gui2.dialogs.select_formats import SelectFormats
|
||||||
fmts = self.gui.library_view.model().db.all_formats()
|
fmts = set([])
|
||||||
d = SelectFormats([x.lower() for x in fmts], msg, parent=self.gui)
|
db = self.gui.library_view.model().db
|
||||||
|
for x in ids:
|
||||||
|
fmts_ = db.formats(x, index_is_id=True, verify_formats=False)
|
||||||
|
if fmts_:
|
||||||
|
fmts.update(frozenset([x.lower() for x in fmts_.split(',')]))
|
||||||
|
d = SelectFormats(list(sorted(fmts)), msg, parent=self.gui)
|
||||||
if d.exec_() != d.Accepted:
|
if d.exec_() != d.Accepted:
|
||||||
return None
|
return None
|
||||||
return d.selected_formats
|
return d.selected_formats
|
||||||
@ -117,7 +123,7 @@ class DeleteAction(InterfaceAction):
|
|||||||
if not ids:
|
if not ids:
|
||||||
return
|
return
|
||||||
fmts = self._get_selected_formats(
|
fmts = self._get_selected_formats(
|
||||||
_('Choose formats to be deleted'))
|
_('Choose formats to be deleted'), ids)
|
||||||
if not fmts:
|
if not fmts:
|
||||||
return
|
return
|
||||||
for id in ids:
|
for id in ids:
|
||||||
@ -135,7 +141,7 @@ class DeleteAction(InterfaceAction):
|
|||||||
if not ids:
|
if not ids:
|
||||||
return
|
return
|
||||||
fmts = self._get_selected_formats(
|
fmts = self._get_selected_formats(
|
||||||
'<p>'+_('Choose formats <b>not</b> to be deleted'))
|
'<p>'+_('Choose formats <b>not</b> to be deleted'), ids)
|
||||||
if fmts is None:
|
if fmts is None:
|
||||||
return
|
return
|
||||||
for id in ids:
|
for id in ids:
|
||||||
@ -223,7 +229,31 @@ class DeleteAction(InterfaceAction):
|
|||||||
rows = view.selectionModel().selectedRows()
|
rows = view.selectionModel().selectedRows()
|
||||||
if not rows or len(rows) == 0:
|
if not rows or len(rows) == 0:
|
||||||
return
|
return
|
||||||
|
# Library view is visible.
|
||||||
if self.gui.stack.currentIndex() == 0:
|
if self.gui.stack.currentIndex() == 0:
|
||||||
|
# Ask the user if they want to delete the book from the library or device if it is in both.
|
||||||
|
if self.gui.device_manager.is_device_connected:
|
||||||
|
on_device = False
|
||||||
|
on_device_ids = self._get_selected_ids()
|
||||||
|
for id in on_device_ids:
|
||||||
|
res = self.gui.book_on_device(id)
|
||||||
|
if res[0] or res[1] or res[2]:
|
||||||
|
on_device = True
|
||||||
|
if on_device:
|
||||||
|
break
|
||||||
|
if on_device:
|
||||||
|
loc = confirm_location('<p>' + _('Some of the selected books are on the attached device. '
|
||||||
|
'<b>Where</b> do you want the selected files deleted from?'),
|
||||||
|
self.gui)
|
||||||
|
if not loc:
|
||||||
|
return
|
||||||
|
elif loc == 'dev':
|
||||||
|
self.remove_matching_books_from_device()
|
||||||
|
return
|
||||||
|
elif loc == 'both':
|
||||||
|
self.remove_matching_books_from_device()
|
||||||
|
# The following will run if the selected books are not on a connected device.
|
||||||
|
# The user has selected to delete from the library or the device and library.
|
||||||
if not confirm('<p>'+_('The selected books will be '
|
if not confirm('<p>'+_('The selected books will be '
|
||||||
'<b>permanently deleted</b> and the files '
|
'<b>permanently deleted</b> and the files '
|
||||||
'removed from your calibre library. Are you sure?')
|
'removed from your calibre library. Are you sure?')
|
||||||
@ -239,7 +269,7 @@ class DeleteAction(InterfaceAction):
|
|||||||
else:
|
else:
|
||||||
self.__md = MultiDeleter(self.gui, rows,
|
self.__md = MultiDeleter(self.gui, rows,
|
||||||
partial(self.library_ids_deleted, current_row=row))
|
partial(self.library_ids_deleted, current_row=row))
|
||||||
|
# Device view is visible.
|
||||||
else:
|
else:
|
||||||
if not confirm('<p>'+_('The selected books will be '
|
if not confirm('<p>'+_('The selected books will be '
|
||||||
'<b>permanently deleted</b> '
|
'<b>permanently deleted</b> '
|
||||||
|
@ -5,40 +5,207 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
|
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
|
import re, os
|
||||||
|
|
||||||
from lxml import html
|
from lxml import html
|
||||||
from lxml.html import soupparser
|
from lxml.html import soupparser
|
||||||
|
|
||||||
from PyQt4.Qt import QApplication, QFontInfo, QPalette, QSize, QWidget, \
|
from PyQt4.Qt import QApplication, QFontInfo, QSize, QWidget, QPlainTextEdit, \
|
||||||
QToolBar, QVBoxLayout, QAction, QIcon
|
QToolBar, QVBoxLayout, QAction, QIcon, QWebPage, Qt, QTabWidget, QUrl, \
|
||||||
|
QSyntaxHighlighter, QColor, QChar, QColorDialog, QMenu, QInputDialog
|
||||||
from PyQt4.QtWebKit import QWebView
|
from PyQt4.QtWebKit import QWebView
|
||||||
|
|
||||||
from calibre.ebooks.chardet import xml_to_unicode
|
from calibre.ebooks.chardet import xml_to_unicode
|
||||||
from calibre import xml_replace_entities
|
from calibre import xml_replace_entities
|
||||||
|
from calibre.gui2 import open_url
|
||||||
|
|
||||||
class EditorWidget(QWebView):
|
class PageAction(QAction): # {{{
|
||||||
|
|
||||||
|
def __init__(self, wac, icon, text, checkable, view):
|
||||||
|
QAction.__init__(self, QIcon(I(icon+'.png')), text, view)
|
||||||
|
self._page_action = getattr(QWebPage, wac)
|
||||||
|
self.setCheckable(checkable)
|
||||||
|
self.triggered.connect(self.trigger_page_action)
|
||||||
|
view.selectionChanged.connect(self.update_state,
|
||||||
|
type=Qt.QueuedConnection)
|
||||||
|
self.page_action.changed.connect(self.update_state,
|
||||||
|
type=Qt.QueuedConnection)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def page_action(self):
|
||||||
|
return self.parent().pageAction(self._page_action)
|
||||||
|
|
||||||
|
def trigger_page_action(self, *args):
|
||||||
|
self.page_action.trigger()
|
||||||
|
|
||||||
|
def update_state(self, *args):
|
||||||
|
if self.isCheckable():
|
||||||
|
self.setChecked(self.page_action.isChecked())
|
||||||
|
self.setEnabled(self.page_action.isEnabled())
|
||||||
|
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
class BlockStyleAction(QAction): # {{{
|
||||||
|
|
||||||
|
def __init__(self, text, name, view):
|
||||||
|
QAction.__init__(self, text, view)
|
||||||
|
self._name = name
|
||||||
|
self.triggered.connect(self.apply_style)
|
||||||
|
|
||||||
|
def apply_style(self, *args):
|
||||||
|
self.parent().exec_command('formatBlock', self._name)
|
||||||
|
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
class EditorWidget(QWebView): # {{{
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
QWebView.__init__(self, parent)
|
QWebView.__init__(self, parent)
|
||||||
|
|
||||||
for name, icon, text, checkable in [
|
for wac, name, icon, text, checkable in [
|
||||||
('bold', 'format-text-bold', _('Bold'), True),
|
('ToggleBold', 'bold', 'format-text-bold', _('Bold'), True),
|
||||||
('italic', 'format-text-italic', _('Italic'), True),
|
('ToggleItalic', 'italic', 'format-text-italic', _('Italic'),
|
||||||
('underline', 'format-text-underline', _('Underline'), True),
|
True),
|
||||||
('strikethrough', 'format-text-underline', _('Underline'), True),
|
('ToggleUnderline', 'underline', 'format-text-underline',
|
||||||
|
_('Underline'), True),
|
||||||
|
('ToggleStrikethrough', 'strikethrough', 'format-text-strikethrough',
|
||||||
|
_('Strikethrough'), True),
|
||||||
|
('ToggleSuperscript', 'superscript', 'format-text-superscript',
|
||||||
|
_('Superscript'), True),
|
||||||
|
('ToggleSubscript', 'subscript', 'format-text-subscript',
|
||||||
|
_('Subscript'), True),
|
||||||
|
('InsertOrderedList', 'ordered_list', 'format-list-ordered',
|
||||||
|
_('Ordered list'), True),
|
||||||
|
('InsertUnorderedList', 'unordered_list', 'format-list-unordered',
|
||||||
|
_('Unordered list'), True),
|
||||||
|
|
||||||
|
('AlignLeft', 'align_left', 'format-justify-left',
|
||||||
|
_('Align left'), False),
|
||||||
|
('AlignCenter', 'align_center', 'format-justify-center',
|
||||||
|
_('Align center'), False),
|
||||||
|
('AlignRight', 'align_right', 'format-justify-right',
|
||||||
|
_('Align right'), False),
|
||||||
|
('AlignJustified', 'align_justified', 'format-justify-fill',
|
||||||
|
_('Align justified'), False),
|
||||||
|
('Undo', 'undo', 'edit-undo', _('Undo'), False),
|
||||||
|
('Redo', 'redo', 'edit-redo', _('Redo'), False),
|
||||||
|
('RemoveFormat', 'remove_format', 'trash', _('Remove formatting'), False),
|
||||||
|
('Copy', 'copy', 'edit-copy', _('Copy'), False),
|
||||||
|
('Paste', 'paste', 'edit-paste', _('Paste'), False),
|
||||||
|
('Cut', 'cut', 'edit-cut', _('Cut'), False),
|
||||||
|
('Indent', 'indent', 'format-indent-more',
|
||||||
|
_('Increase Indentation'), False),
|
||||||
|
('Outdent', 'outdent', 'format-indent-less',
|
||||||
|
_('Decrease Indentation'), False),
|
||||||
|
('SelectAll', 'select_all', 'edit-select-all',
|
||||||
|
_('Select all'), False),
|
||||||
]:
|
]:
|
||||||
ac = QAction(QIcon(I(icon+'.png')), text, self)
|
ac = PageAction(wac, icon, text, checkable, self)
|
||||||
ac.setCheckable(checkable)
|
|
||||||
setattr(self, 'action_'+name, ac)
|
setattr(self, 'action_'+name, ac)
|
||||||
|
|
||||||
|
self.action_color = QAction(QIcon(I('format-text-color')), _('Foreground color'),
|
||||||
|
self)
|
||||||
|
self.action_color.triggered.connect(self.foreground_color)
|
||||||
|
|
||||||
|
self.action_background = QAction(QIcon(I('format-fill-color')),
|
||||||
|
_('Background color'), self)
|
||||||
|
self.action_background.triggered.connect(self.background_color)
|
||||||
|
|
||||||
|
self.action_block_style = QAction(QIcon(I('format-text-heading')),
|
||||||
|
_('Style text block'), self)
|
||||||
|
self.action_block_style.setToolTip(
|
||||||
|
_('Style the selected text block'))
|
||||||
|
self.block_style_menu = QMenu(self)
|
||||||
|
self.action_block_style.setMenu(self.block_style_menu)
|
||||||
|
self.block_style_actions = []
|
||||||
|
for text, name in [
|
||||||
|
(_('Normal'), 'p'),
|
||||||
|
(_('Heading') +' 1', 'h1'),
|
||||||
|
(_('Heading') +' 2', 'h2'),
|
||||||
|
(_('Heading') +' 3', 'h3'),
|
||||||
|
(_('Heading') +' 4', 'h4'),
|
||||||
|
(_('Heading') +' 5', 'h5'),
|
||||||
|
(_('Heading') +' 6', 'h6'),
|
||||||
|
(_('Pre-formatted'), 'pre'),
|
||||||
|
(_('Blockquote'), 'blockquote'),
|
||||||
|
(_('Address'), 'address'),
|
||||||
|
]:
|
||||||
|
ac = BlockStyleAction(text, name, self)
|
||||||
|
self.block_style_menu.addAction(ac)
|
||||||
|
self.block_style_actions.append(ac)
|
||||||
|
|
||||||
|
self.action_insert_link = QAction(QIcon(I('insert-link.png')),
|
||||||
|
_('Insert link'), self)
|
||||||
|
self.action_insert_link.triggered.connect(self.insert_link)
|
||||||
|
|
||||||
|
self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
|
||||||
|
self.page().linkClicked.connect(self.link_clicked)
|
||||||
|
|
||||||
|
def link_clicked(self, url):
|
||||||
|
open_url(url)
|
||||||
|
|
||||||
|
def foreground_color(self):
|
||||||
|
col = QColorDialog.getColor(Qt.black, self,
|
||||||
|
_('Choose foreground color'), QColorDialog.ShowAlphaChannel)
|
||||||
|
if col.isValid():
|
||||||
|
self.exec_command('foreColor', unicode(col.name()))
|
||||||
|
|
||||||
|
def background_color(self):
|
||||||
|
col = QColorDialog.getColor(Qt.white, self,
|
||||||
|
_('Choose background color'), QColorDialog.ShowAlphaChannel)
|
||||||
|
if col.isValid():
|
||||||
|
self.exec_command('hiliteColor', unicode(col.name()))
|
||||||
|
|
||||||
|
def insert_link(self, *args):
|
||||||
|
link, ok = QInputDialog.getText(self, _('Create link'),
|
||||||
|
_('Enter URL'))
|
||||||
|
if not ok:
|
||||||
|
return
|
||||||
|
url = self.parse_link(unicode(link))
|
||||||
|
if url.isValid():
|
||||||
|
url = unicode(url.toString())
|
||||||
|
self.exec_command('createLink', url)
|
||||||
|
|
||||||
|
def parse_link(self, link):
|
||||||
|
link = link.strip()
|
||||||
|
has_schema = re.match(r'^[a-zA-Z]+:', link)
|
||||||
|
if has_schema is not None:
|
||||||
|
url = QUrl(link, QUrl.TolerantMode)
|
||||||
|
if url.isValid():
|
||||||
|
return url
|
||||||
|
if os.path.exists(link):
|
||||||
|
return QUrl.fromLocalFile(link)
|
||||||
|
|
||||||
|
if has_schema is None:
|
||||||
|
first, _, rest = link.partition('.')
|
||||||
|
prefix = 'http'
|
||||||
|
if first == 'ftp':
|
||||||
|
prefix = 'ftp'
|
||||||
|
url = QUrl(prefix +'://'+link, QUrl.TolerantMode)
|
||||||
|
if url.isValid():
|
||||||
|
return url
|
||||||
|
|
||||||
|
return QUrl(link, QUrl.TolerantMode)
|
||||||
|
|
||||||
def sizeHint(self):
|
def sizeHint(self):
|
||||||
return QSize(150, 150)
|
return QSize(150, 150)
|
||||||
|
|
||||||
|
def exec_command(self, cmd, arg=None):
|
||||||
|
frame = self.page().mainFrame()
|
||||||
|
if arg is not None:
|
||||||
|
js = 'document.execCommand("%s", false, "%s");' % (cmd, arg)
|
||||||
|
else:
|
||||||
|
js = 'document.execCommand("%s", false, null);' % cmd
|
||||||
|
frame.evaluateJavaScript(js)
|
||||||
|
|
||||||
@dynamic_property
|
@dynamic_property
|
||||||
def html(self):
|
def html(self):
|
||||||
|
|
||||||
def fget(self):
|
def fget(self):
|
||||||
ans = u''
|
ans = u''
|
||||||
|
check = unicode(self.page().mainFrame().toPlainText()).strip()
|
||||||
|
if not check:
|
||||||
|
return ans
|
||||||
try:
|
try:
|
||||||
raw = unicode(self.page().mainFrame().toHtml())
|
raw = unicode(self.page().mainFrame().toHtml())
|
||||||
raw = xml_to_unicode(raw, strip_encoding_pats=True,
|
raw = xml_to_unicode(raw, strip_encoding_pats=True,
|
||||||
@ -67,12 +234,7 @@ class EditorWidget(QWebView):
|
|||||||
def fset(self, val):
|
def fset(self, val):
|
||||||
self.setHtml(val)
|
self.setHtml(val)
|
||||||
f = QFontInfo(QApplication.font(self)).pixelSize()
|
f = QFontInfo(QApplication.font(self)).pixelSize()
|
||||||
b = unicode(QApplication.palette().color(QPalette.Normal,
|
style = 'font-size: %dpx;' % (f,)
|
||||||
QPalette.Base).name())
|
|
||||||
c = unicode(QApplication.palette().color(QPalette.Normal,
|
|
||||||
QPalette.Text).name())
|
|
||||||
style = 'font-size: %dpx; background-color: %s; color: %s' % (f, b,
|
|
||||||
c)
|
|
||||||
|
|
||||||
for body in self.page().mainFrame().documentElement().findAll('body'):
|
for body in self.page().mainFrame().documentElement().findAll('body'):
|
||||||
body.setAttribute('style', style)
|
body.setAttribute('style', style)
|
||||||
@ -80,26 +242,316 @@ class EditorWidget(QWebView):
|
|||||||
|
|
||||||
return property(fget=fget, fset=fset)
|
return property(fget=fget, fset=fset)
|
||||||
|
|
||||||
|
# }}}
|
||||||
|
|
||||||
class Editor(QWidget):
|
# Highlighter {{{
|
||||||
|
State_Text = -1
|
||||||
|
State_DocType = 0
|
||||||
|
State_Comment = 1
|
||||||
|
State_TagStart = 2
|
||||||
|
State_TagName = 3
|
||||||
|
State_InsideTag = 4
|
||||||
|
State_AttributeName = 5
|
||||||
|
State_SingleQuote = 6
|
||||||
|
State_DoubleQuote = 7
|
||||||
|
State_AttributeValue = 8
|
||||||
|
|
||||||
|
class Highlighter(QSyntaxHighlighter):
|
||||||
|
|
||||||
|
def __init__(self, doc):
|
||||||
|
QSyntaxHighlighter.__init__(self, doc)
|
||||||
|
self.colors = {}
|
||||||
|
self.colors['doctype'] = QColor(192, 192, 192)
|
||||||
|
self.colors['entity'] = QColor(128, 128, 128)
|
||||||
|
self.colors['tag'] = QColor(136, 18, 128)
|
||||||
|
self.colors['comment'] = QColor( 35, 110, 37)
|
||||||
|
self.colors['attrname'] = QColor(153, 69, 0)
|
||||||
|
self.colors['attrval'] = QColor( 36, 36, 170)
|
||||||
|
|
||||||
|
def highlightBlock(self, text):
|
||||||
|
state = self.previousBlockState()
|
||||||
|
len_ = text.length()
|
||||||
|
start = 0
|
||||||
|
pos = 0
|
||||||
|
|
||||||
|
while pos < len_:
|
||||||
|
|
||||||
|
if state == State_Comment:
|
||||||
|
start = pos
|
||||||
|
while pos < len_:
|
||||||
|
if text.mid(pos, 3) == "-->":
|
||||||
|
pos += 3;
|
||||||
|
state = State_Text;
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
pos += 1
|
||||||
|
self.setFormat(start, pos - start, self.colors['comment'])
|
||||||
|
|
||||||
|
elif state == State_DocType:
|
||||||
|
start = pos
|
||||||
|
while pos < len_:
|
||||||
|
ch = text.at(pos)
|
||||||
|
pos += 1
|
||||||
|
if ch == QChar('>'):
|
||||||
|
state = State_Text
|
||||||
|
break
|
||||||
|
self.setFormat(start, pos - start, self.colors['doctype'])
|
||||||
|
|
||||||
|
# at '<' in e.g. "<span>foo</span>"
|
||||||
|
elif state == State_TagStart:
|
||||||
|
start = pos + 1
|
||||||
|
while pos < len_:
|
||||||
|
ch = text.at(pos)
|
||||||
|
pos += 1
|
||||||
|
if ch == QChar('>'):
|
||||||
|
state = State_Text
|
||||||
|
break
|
||||||
|
if not ch.isSpace():
|
||||||
|
pos -= 1
|
||||||
|
state = State_TagName
|
||||||
|
break
|
||||||
|
|
||||||
|
# at 'b' in e.g "<blockquote>foo</blockquote>"
|
||||||
|
elif state == State_TagName:
|
||||||
|
start = pos
|
||||||
|
while pos < len_:
|
||||||
|
ch = text.at(pos)
|
||||||
|
pos += 1
|
||||||
|
if ch.isSpace():
|
||||||
|
pos -= 1
|
||||||
|
state = State_InsideTag
|
||||||
|
break
|
||||||
|
if ch == QChar('>'):
|
||||||
|
state = State_Text
|
||||||
|
break
|
||||||
|
self.setFormat(start, pos - start, self.colors['tag']);
|
||||||
|
|
||||||
|
# anywhere after tag name and before tag closing ('>')
|
||||||
|
elif state == State_InsideTag:
|
||||||
|
start = pos
|
||||||
|
|
||||||
|
while pos < len_:
|
||||||
|
ch = text.at(pos)
|
||||||
|
pos += 1
|
||||||
|
|
||||||
|
if ch == QChar('/'):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if ch == QChar('>'):
|
||||||
|
state = State_Text
|
||||||
|
break
|
||||||
|
|
||||||
|
if not ch.isSpace():
|
||||||
|
pos -= 1
|
||||||
|
state = State_AttributeName
|
||||||
|
break
|
||||||
|
|
||||||
|
# at 's' in e.g. <img src=bla.png/>
|
||||||
|
elif state == State_AttributeName:
|
||||||
|
start = pos
|
||||||
|
|
||||||
|
while pos < len_:
|
||||||
|
ch = text.at(pos)
|
||||||
|
pos += 1
|
||||||
|
|
||||||
|
if ch == QChar('='):
|
||||||
|
state = State_AttributeValue
|
||||||
|
break
|
||||||
|
|
||||||
|
if ch in (QChar('>'), QChar('/')):
|
||||||
|
state = State_InsideTag
|
||||||
|
break
|
||||||
|
|
||||||
|
self.setFormat(start, pos - start, self.colors['attrname'])
|
||||||
|
|
||||||
|
# after '=' in e.g. <img src=bla.png/>
|
||||||
|
elif state == State_AttributeValue:
|
||||||
|
start = pos
|
||||||
|
|
||||||
|
# find first non-space character
|
||||||
|
while pos < len_:
|
||||||
|
ch = text.at(pos)
|
||||||
|
pos += 1
|
||||||
|
|
||||||
|
# handle opening single quote
|
||||||
|
if ch == QChar("'"):
|
||||||
|
state = State_SingleQuote
|
||||||
|
break
|
||||||
|
|
||||||
|
# handle opening double quote
|
||||||
|
if ch == QChar('"'):
|
||||||
|
state = State_DoubleQuote
|
||||||
|
break
|
||||||
|
|
||||||
|
if not ch.isSpace():
|
||||||
|
break
|
||||||
|
|
||||||
|
if state == State_AttributeValue:
|
||||||
|
# attribute value without quote
|
||||||
|
# just stop at non-space or tag delimiter
|
||||||
|
start = pos
|
||||||
|
while pos < len_:
|
||||||
|
ch = text.at(pos);
|
||||||
|
if ch.isSpace():
|
||||||
|
break
|
||||||
|
if ch in (QChar('>'), QChar('/')):
|
||||||
|
break
|
||||||
|
pos += 1
|
||||||
|
state = State_InsideTag
|
||||||
|
self.setFormat(start, pos - start, self.colors['attrval'])
|
||||||
|
|
||||||
|
# after the opening single quote in an attribute value
|
||||||
|
elif state == State_SingleQuote:
|
||||||
|
start = pos
|
||||||
|
|
||||||
|
while pos < len_:
|
||||||
|
ch = text.at(pos)
|
||||||
|
pos += 1
|
||||||
|
if ch == QChar("'"):
|
||||||
|
break
|
||||||
|
|
||||||
|
state = State_InsideTag
|
||||||
|
|
||||||
|
self.setFormat(start, pos - start, self.colors['attrval'])
|
||||||
|
|
||||||
|
# after the opening double quote in an attribute value
|
||||||
|
elif state == State_DoubleQuote:
|
||||||
|
start = pos
|
||||||
|
|
||||||
|
while pos < len_:
|
||||||
|
ch = text.at(pos)
|
||||||
|
pos += 1
|
||||||
|
if ch == QChar('"'):
|
||||||
|
break
|
||||||
|
|
||||||
|
state = State_InsideTag
|
||||||
|
|
||||||
|
self.setFormat(start, pos - start, self.colors['attrval'])
|
||||||
|
|
||||||
|
else:
|
||||||
|
# State_Text and default
|
||||||
|
while pos < len_:
|
||||||
|
ch = text.at(pos)
|
||||||
|
if ch == QChar('<'):
|
||||||
|
if text.mid(pos, 4) == "<!--":
|
||||||
|
state = State_Comment
|
||||||
|
else:
|
||||||
|
if text.mid(pos, 9).toUpper() == "<!DOCTYPE":
|
||||||
|
state = State_DocType
|
||||||
|
else:
|
||||||
|
state = State_TagStart
|
||||||
|
break;
|
||||||
|
elif ch == QChar('&'):
|
||||||
|
start = pos
|
||||||
|
while pos < len_ and text.at(pos) != QChar(';'):
|
||||||
|
self.setFormat(start, pos - start,
|
||||||
|
self.colors['entity'])
|
||||||
|
pos += 1
|
||||||
|
|
||||||
|
else:
|
||||||
|
pos += 1
|
||||||
|
|
||||||
|
|
||||||
|
self.setCurrentBlockState(state)
|
||||||
|
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
class Editor(QWidget): # {{{
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
QWidget.__init__(self, parent)
|
QWidget.__init__(self, parent)
|
||||||
self.toolbar = QToolBar(self)
|
self.toolbar1 = QToolBar(self)
|
||||||
|
self.toolbar2 = QToolBar(self)
|
||||||
self.editor = EditorWidget(self)
|
self.editor = EditorWidget(self)
|
||||||
|
self.tabs = QTabWidget(self)
|
||||||
|
self.tabs.setTabPosition(self.tabs.South)
|
||||||
|
self.wyswyg = QWidget(self.tabs)
|
||||||
|
self.code_edit = QPlainTextEdit(self.tabs)
|
||||||
|
self.source_dirty = False
|
||||||
|
self.wyswyg_dirty = True
|
||||||
|
|
||||||
self._layout = QVBoxLayout(self)
|
self._layout = QVBoxLayout(self)
|
||||||
|
self.wyswyg.layout = l = QVBoxLayout(self.wyswyg)
|
||||||
self.setLayout(self._layout)
|
self.setLayout(self._layout)
|
||||||
self._layout.setContentsMargins(0, 0, 0, 0)
|
l.setContentsMargins(0, 0, 0, 0)
|
||||||
self._layout.addWidget(self.toolbar)
|
l.addWidget(self.toolbar1)
|
||||||
self._layout.addWidget(self.editor)
|
l.addWidget(self.toolbar2)
|
||||||
|
l.addWidget(self.editor)
|
||||||
|
self._layout.addWidget(self.tabs)
|
||||||
|
self.tabs.addTab(self.wyswyg, _('Normal view'))
|
||||||
|
self.tabs.addTab(self.code_edit, _('HTML Source'))
|
||||||
|
self.tabs.currentChanged[int].connect(self.change_tab)
|
||||||
|
self.highlighter = Highlighter(self.code_edit.document())
|
||||||
|
|
||||||
|
for x in ('bold', 'italic', 'underline', 'strikethrough',
|
||||||
|
'superscript', 'subscript', 'indent', 'outdent'):
|
||||||
|
ac = getattr(self.editor, 'action_'+x)
|
||||||
|
if x in ('superscript', 'indent'):
|
||||||
|
self.toolbar2.addSeparator()
|
||||||
|
self.toolbar2.addAction(ac)
|
||||||
|
self.toolbar2.addSeparator()
|
||||||
|
|
||||||
|
for x in ('left', 'center', 'right', 'justified'):
|
||||||
|
ac = getattr(self.editor, 'action_align_'+x)
|
||||||
|
self.toolbar2.addAction(ac)
|
||||||
|
self.toolbar2.addSeparator()
|
||||||
|
|
||||||
|
self.toolbar1.addAction(self.editor.action_undo)
|
||||||
|
self.toolbar1.addAction(self.editor.action_redo)
|
||||||
|
self.toolbar1.addAction(self.editor.action_select_all)
|
||||||
|
self.toolbar1.addAction(self.editor.action_remove_format)
|
||||||
|
self.toolbar1.addSeparator()
|
||||||
|
|
||||||
|
for x in ('copy', 'cut', 'paste'):
|
||||||
|
ac = getattr(self.editor, 'action_'+x)
|
||||||
|
self.toolbar1.addAction(ac)
|
||||||
|
self.toolbar1.addSeparator()
|
||||||
|
|
||||||
|
for x in ('', 'un'):
|
||||||
|
ac = getattr(self.editor, 'action_%sordered_list'%x)
|
||||||
|
self.toolbar1.addAction(ac)
|
||||||
|
self.toolbar1.addSeparator()
|
||||||
|
|
||||||
|
self.toolbar1.addAction(self.editor.action_color)
|
||||||
|
self.toolbar1.addAction(self.editor.action_background)
|
||||||
|
self.toolbar1.addSeparator()
|
||||||
|
|
||||||
|
self.toolbar1.addAction(self.editor.action_block_style)
|
||||||
|
w = self.toolbar1.widgetForAction(self.editor.action_block_style)
|
||||||
|
w.setPopupMode(w.InstantPopup)
|
||||||
|
self.toolbar1.addAction(self.editor.action_insert_link)
|
||||||
|
|
||||||
|
self.code_edit.textChanged.connect(self.code_dirtied)
|
||||||
|
self.editor.page().contentsChanged.connect(self.wyswyg_dirtied)
|
||||||
|
|
||||||
@dynamic_property
|
@dynamic_property
|
||||||
def html(self):
|
def html(self):
|
||||||
def fset(self, v):
|
def fset(self, v):
|
||||||
self.editor.html = v
|
self.editor.html = v
|
||||||
return property(fget=lambda self:self.editor.html, fset=fset)
|
def fget(self):
|
||||||
|
self.tabs.setCurrentIndex(0)
|
||||||
|
return self.editor.html
|
||||||
|
return property(fget=fget, fset=fset)
|
||||||
|
|
||||||
|
def change_tab(self, index):
|
||||||
|
#print 'reloading:', (index and self.wyswyg_dirty) or (not index and
|
||||||
|
# self.source_dirty)
|
||||||
|
if index == 1: # changing to code view
|
||||||
|
if self.wyswyg_dirty:
|
||||||
|
self.code_edit.setPlainText(self.editor.html)
|
||||||
|
self.wyswyg_dirty = False
|
||||||
|
elif index == 0: #changing to wyswyg
|
||||||
|
if self.source_dirty:
|
||||||
|
self.editor.html = unicode(self.code_edit.toPlainText())
|
||||||
|
self.source_dirty = False
|
||||||
|
|
||||||
|
def wyswyg_dirtied(self, *args):
|
||||||
|
self.wyswyg_dirty = True
|
||||||
|
|
||||||
|
def code_dirtied(self, *args):
|
||||||
|
self.source_dirty = True
|
||||||
|
|
||||||
|
# }}}
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app = QApplication([])
|
app = QApplication([])
|
||||||
|
@ -17,6 +17,8 @@ class PluginWidget(Widget, Ui_Form):
|
|||||||
ICON = I('mimetypes/fb2.png')
|
ICON = I('mimetypes/fb2.png')
|
||||||
|
|
||||||
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
|
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
|
||||||
Widget.__init__(self, parent, ['h1_to_title', 'h2_to_title', 'h3_to_title'])
|
Widget.__init__(self, parent, ['sectionize'])
|
||||||
self.db, self.book_id = db, book_id
|
self.db, self.book_id = db, book_id
|
||||||
|
for x in ('toc', 'files', 'nothing'):
|
||||||
|
self.opt_sectionize.addItem(x)
|
||||||
self.initialize_options(get_option, get_help, db, book_id)
|
self.initialize_options(get_option, get_help, db, book_id)
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<string>Form</string>
|
<string>Form</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
<item row="3" column="0">
|
<item row="1" column="0">
|
||||||
<spacer name="verticalSpacer">
|
<spacer name="verticalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
@ -28,23 +28,19 @@
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QCheckBox" name="opt_h1_to_title">
|
<widget class="QLabel" name="label">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Wrap h1 tags with <title> elements</string>
|
<string>Sectionize:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>opt_sectionize</cstring>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="0" column="1">
|
||||||
<widget class="QCheckBox" name="opt_h2_to_title">
|
<widget class="QComboBox" name="opt_sectionize">
|
||||||
<property name="text">
|
<property name="minimumContentsLength">
|
||||||
<string>Wrap h2 tags with <title> elements</string>
|
<number>20</number>
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QCheckBox" name="opt_h3_to_title">
|
|
||||||
<property name="text">
|
|
||||||
<string>Wrap h3 tags with <title> elements</string>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -11,7 +11,6 @@ from PyQt4.Qt import Qt
|
|||||||
from calibre.gui2.convert.mobi_output_ui import Ui_Form
|
from calibre.gui2.convert.mobi_output_ui import Ui_Form
|
||||||
from calibre.gui2.convert import Widget
|
from calibre.gui2.convert import Widget
|
||||||
from calibre.gui2.widgets import FontFamilyModel
|
from calibre.gui2.widgets import FontFamilyModel
|
||||||
from calibre.utils.fonts import fontconfig
|
|
||||||
|
|
||||||
font_family_model = None
|
font_family_model = None
|
||||||
|
|
||||||
@ -28,6 +27,7 @@ class PluginWidget(Widget, Ui_Form):
|
|||||||
'mobi_ignore_margins',
|
'mobi_ignore_margins',
|
||||||
'dont_compress', 'no_inline_toc', 'masthead_font','personal_doc']
|
'dont_compress', 'no_inline_toc', 'masthead_font','personal_doc']
|
||||||
)
|
)
|
||||||
|
from calibre.utils.fonts import fontconfig
|
||||||
self.db, self.book_id = db, book_id
|
self.db, self.book_id = db, book_id
|
||||||
|
|
||||||
global font_family_model
|
global font_family_model
|
||||||
|
@ -303,7 +303,7 @@ class Series(Base):
|
|||||||
if val == '':
|
if val == '':
|
||||||
val = s_index = None
|
val = s_index = None
|
||||||
elif s_index == 0.0:
|
elif s_index == 0.0:
|
||||||
if tweaks['series_index_auto_increment'] == 'next':
|
if tweaks['series_index_auto_increment'] != 'const':
|
||||||
s_index = self.db.get_next_cc_series_num_for(val,
|
s_index = self.db.get_next_cc_series_num_for(val,
|
||||||
num=self.col_id)
|
num=self.col_id)
|
||||||
else:
|
else:
|
||||||
@ -572,7 +572,6 @@ class BulkSeries(BulkBase):
|
|||||||
val = None if clear else self.normalize_ui_val(val)
|
val = None if clear else self.normalize_ui_val(val)
|
||||||
if clear or val != '':
|
if clear or val != '':
|
||||||
extras = []
|
extras = []
|
||||||
next_index = self.db.get_next_cc_series_num_for(val, num=self.col_id)
|
|
||||||
for book_id in book_ids:
|
for book_id in book_ids:
|
||||||
if clear:
|
if clear:
|
||||||
extras.append(None)
|
extras.append(None)
|
||||||
@ -581,9 +580,8 @@ class BulkSeries(BulkBase):
|
|||||||
if force_start:
|
if force_start:
|
||||||
s_index = at_value
|
s_index = at_value
|
||||||
at_value += 1
|
at_value += 1
|
||||||
elif tweaks['series_index_auto_increment'] == 'next':
|
elif tweaks['series_index_auto_increment'] != 'const':
|
||||||
s_index = next_index
|
s_index = self.db.get_next_cc_series_num_for(val, num=self.col_id)
|
||||||
next_index += 1
|
|
||||||
else:
|
else:
|
||||||
s_index = 1.0
|
s_index = 1.0
|
||||||
else:
|
else:
|
||||||
|
@ -32,6 +32,11 @@ class ChooseLibrary(QDialog, Ui_Dialog):
|
|||||||
loc = unicode(self.old_location.text()).format(lp)
|
loc = unicode(self.old_location.text()).format(lp)
|
||||||
self.old_location.setText(loc)
|
self.old_location.setText(loc)
|
||||||
self.browse_button.clicked.connect(self.choose_loc)
|
self.browse_button.clicked.connect(self.choose_loc)
|
||||||
|
self.empty_library.toggled.connect(self.empty_library_toggled)
|
||||||
|
self.copy_structure.setEnabled(False)
|
||||||
|
|
||||||
|
def empty_library_toggled(self, to_what):
|
||||||
|
self.copy_structure.setEnabled(to_what)
|
||||||
|
|
||||||
def choose_loc(self, *args):
|
def choose_loc(self, *args):
|
||||||
loc = choose_dir(self, 'choose library location',
|
loc = choose_dir(self, 'choose library location',
|
||||||
@ -64,7 +69,7 @@ class ChooseLibrary(QDialog, Ui_Dialog):
|
|||||||
def perform_action(self, ac, loc):
|
def perform_action(self, ac, loc):
|
||||||
if ac in ('new', 'existing'):
|
if ac in ('new', 'existing'):
|
||||||
prefs['library_path'] = loc
|
prefs['library_path'] = loc
|
||||||
self.callback(loc)
|
self.callback(loc, copy_structure=self.copy_structure.isChecked())
|
||||||
else:
|
else:
|
||||||
move_library(self.db.library_path, loc, self.parent(),
|
move_library(self.db.library_path, loc, self.parent(),
|
||||||
self.callback)
|
self.callback)
|
||||||
|
@ -49,12 +49,27 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0" colspan="3">
|
<item row="5" column="0" colspan="3">
|
||||||
|
<layout class="QHBoxLayout" name="hbox1">
|
||||||
|
<item>
|
||||||
<widget class="QRadioButton" name="empty_library">
|
<widget class="QRadioButton" name="empty_library">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>&Create an empty library at the new location</string>
|
<string>&Create an empty library at the new location</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="copy_structure">
|
||||||
|
<property name="text">
|
||||||
|
<string>&Copy structure from the current library</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Copy the custom columns, saved searches, column widths, plugboards,
|
||||||
|
user categories, and other information from the old to the new library</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
<item row="6" column="0" colspan="3">
|
<item row="6" column="0" colspan="3">
|
||||||
<widget class="QRadioButton" name="move_library">
|
<widget class="QRadioButton" name="move_library">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
|
51
src/calibre/gui2/dialogs/confirm_delete_location.py
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
__license__ = 'GPL v3'
|
||||||
|
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' \
|
||||||
|
'2010, John Schember <john@nachtimwald.com>'
|
||||||
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
|
from calibre.gui2.dialogs.confirm_delete_location_ui import Ui_Dialog
|
||||||
|
from PyQt4.Qt import QDialog, Qt, QPixmap, QIcon
|
||||||
|
|
||||||
|
class Dialog(QDialog, Ui_Dialog):
|
||||||
|
|
||||||
|
def __init__(self, msg, name, parent):
|
||||||
|
QDialog.__init__(self, parent)
|
||||||
|
self.setupUi(self)
|
||||||
|
|
||||||
|
self.loc = None
|
||||||
|
self.msg.setText(msg)
|
||||||
|
self.name = name
|
||||||
|
self.buttonBox.setFocus(Qt.OtherFocusReason)
|
||||||
|
self.button_lib.clicked.connect(partial(self.set_loc, 'lib'))
|
||||||
|
self.button_device.clicked.connect(partial(self.set_loc, 'dev'))
|
||||||
|
self.button_both.clicked.connect(partial(self.set_loc, 'both'))
|
||||||
|
|
||||||
|
def set_loc(self, loc):
|
||||||
|
self.loc = loc
|
||||||
|
self.accept()
|
||||||
|
|
||||||
|
def choice(self):
|
||||||
|
return self.loc
|
||||||
|
|
||||||
|
def break_cycles(self):
|
||||||
|
for x in ('lib', 'device', 'both'):
|
||||||
|
b = getattr(self, 'button_'+x)
|
||||||
|
try:
|
||||||
|
b.clicked.disconnect()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def confirm_location(msg, name, parent=None, pixmap='dialog_warning.png'):
|
||||||
|
d = Dialog(msg, name, parent)
|
||||||
|
d.label.setPixmap(QPixmap(I(pixmap)))
|
||||||
|
d.setWindowIcon(QIcon(I(pixmap)))
|
||||||
|
d.resize(d.sizeHint())
|
||||||
|
ret = d.exec_()
|
||||||
|
d.break_cycles()
|
||||||
|
if ret == d.Accepted:
|
||||||
|
return d.choice()
|
||||||
|
return None
|
116
src/calibre/gui2/dialogs/confirm_delete_location.ui
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>Dialog</class>
|
||||||
|
<widget class="QDialog" name="Dialog">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>459</width>
|
||||||
|
<height>300</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Where do you want to delete from?</string>
|
||||||
|
</property>
|
||||||
|
<property name="windowIcon">
|
||||||
|
<iconset resource="../../../../resources/images.qrc">
|
||||||
|
<normaloff>:/images/dialog_warning.png</normaloff>:/images/dialog_warning.png</iconset>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="pixmap">
|
||||||
|
<pixmap resource="../../../../resources/images.qrc">:/images/dialog_warning.png</pixmap>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="msg">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="button_lib">
|
||||||
|
<property name="text">
|
||||||
|
<string>Library</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="button_device">
|
||||||
|
<property name="text">
|
||||||
|
<string>Device</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="button_both">
|
||||||
|
<property name="text">
|
||||||
|
<string>Library and Device</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Cancel</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources>
|
||||||
|
<include location="../../../../resources/images.qrc"/>
|
||||||
|
</resources>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>Dialog</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>248</x>
|
||||||
|
<y>254</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>157</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>Dialog</receiver>
|
||||||
|
<slot>reject()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>316</x>
|
||||||
|
<y>260</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>286</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
@ -3,7 +3,7 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
|
|||||||
|
|
||||||
'''Dialog to edit metadata in bulk'''
|
'''Dialog to edit metadata in bulk'''
|
||||||
|
|
||||||
import re
|
import re, os
|
||||||
|
|
||||||
from PyQt4.Qt import Qt, QDialog, QGridLayout, QVBoxLayout, QFont, QLabel, \
|
from PyQt4.Qt import Qt, QDialog, QGridLayout, QVBoxLayout, QFont, QLabel, \
|
||||||
pyqtSignal, QDialogButtonBox
|
pyqtSignal, QDialogButtonBox
|
||||||
@ -12,12 +12,41 @@ from PyQt4 import QtGui
|
|||||||
from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog
|
from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog
|
||||||
from calibre.gui2.dialogs.tag_editor import TagEditor
|
from calibre.gui2.dialogs.tag_editor import TagEditor
|
||||||
from calibre.ebooks.metadata import string_to_authors, authors_to_string
|
from calibre.ebooks.metadata import string_to_authors, authors_to_string
|
||||||
|
from calibre.ebooks.metadata.meta import get_metadata
|
||||||
from calibre.gui2.custom_column_widgets import populate_metadata_page
|
from calibre.gui2.custom_column_widgets import populate_metadata_page
|
||||||
from calibre.gui2 import error_dialog
|
from calibre.gui2 import error_dialog
|
||||||
from calibre.gui2.progress_indicator import ProgressIndicator
|
from calibre.gui2.progress_indicator import ProgressIndicator
|
||||||
from calibre.utils.config import dynamic
|
from calibre.utils.config import dynamic
|
||||||
from calibre.utils.titlecase import titlecase
|
from calibre.utils.titlecase import titlecase
|
||||||
from calibre.utils.icu import sort_key, capitalize
|
from calibre.utils.icu import sort_key, capitalize
|
||||||
|
from calibre.utils.config import prefs
|
||||||
|
from calibre.utils.magick.draw import identify_data
|
||||||
|
|
||||||
|
def get_cover_data(path):
|
||||||
|
old = prefs['read_file_metadata']
|
||||||
|
if not old:
|
||||||
|
prefs['read_file_metadata'] = True
|
||||||
|
cdata = area = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
mi = get_metadata(open(path, 'rb'),
|
||||||
|
os.path.splitext(path)[1][1:].lower())
|
||||||
|
if mi.cover and os.access(mi.cover, os.R_OK):
|
||||||
|
cdata = open(mi.cover).read()
|
||||||
|
elif mi.cover_data[1] is not None:
|
||||||
|
cdata = mi.cover_data[1]
|
||||||
|
if cdata:
|
||||||
|
width, height, fmt = identify_data(cdata)
|
||||||
|
area = width*height
|
||||||
|
except:
|
||||||
|
cdata = area = None
|
||||||
|
|
||||||
|
if old != prefs['read_file_metadata']:
|
||||||
|
prefs['read_file_metadata'] = old
|
||||||
|
|
||||||
|
return cdata, area
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MyBlockingBusy(QDialog):
|
class MyBlockingBusy(QDialog):
|
||||||
|
|
||||||
@ -146,6 +175,20 @@ class MyBlockingBusy(QDialog):
|
|||||||
cdata = calibre_cover(mi.title, mi.format_field('authors')[-1],
|
cdata = calibre_cover(mi.title, mi.format_field('authors')[-1],
|
||||||
series_string=series_string)
|
series_string=series_string)
|
||||||
self.db.set_cover(id, cdata)
|
self.db.set_cover(id, cdata)
|
||||||
|
elif cover_action == 'fromfmt':
|
||||||
|
fmts = self.db.formats(id, index_is_id=True, verify_formats=False)
|
||||||
|
if fmts:
|
||||||
|
covers = []
|
||||||
|
for fmt in fmts.split(','):
|
||||||
|
fmt = self.db.format_abspath(id, fmt, index_is_id=True)
|
||||||
|
if not fmt: continue
|
||||||
|
cdata, area = get_cover_data(fmt)
|
||||||
|
if cdata:
|
||||||
|
covers.append((cdata, area))
|
||||||
|
covers.sort(key=lambda x: x[1])
|
||||||
|
if covers:
|
||||||
|
self.db.set_cover(id, covers[-1][0])
|
||||||
|
covers = []
|
||||||
elif self.current_phase == 2:
|
elif self.current_phase == 2:
|
||||||
# All of these just affect the DB, so we can tolerate a total rollback
|
# All of these just affect the DB, so we can tolerate a total rollback
|
||||||
if do_auto_author:
|
if do_auto_author:
|
||||||
@ -700,6 +743,8 @@ class MetadataBulkDialog(QDialog, Ui_MetadataBulkDialog):
|
|||||||
cover_action = 'remove'
|
cover_action = 'remove'
|
||||||
elif self.cover_generate.isChecked():
|
elif self.cover_generate.isChecked():
|
||||||
cover_action = 'generate'
|
cover_action = 'generate'
|
||||||
|
elif self.cover_from_fmt.isChecked():
|
||||||
|
cover_action = 'fromfmt'
|
||||||
|
|
||||||
args = (remove_all, remove, add, au, aus, do_aus, rating, pub, do_series,
|
args = (remove_all, remove, add, au, aus, do_aus, rating, pub, do_series,
|
||||||
do_autonumber, do_remove_format, remove_format, do_swap_ta,
|
do_autonumber, do_remove_format, remove_format, do_swap_ta,
|
||||||
|
@ -414,6 +414,13 @@ Future conversion of these books will use the default settings.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QRadioButton" name="cover_from_fmt">
|
||||||
|
<property name="text">
|
||||||
|
<string>Set from &ebook file(s)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@ -686,8 +693,8 @@ nothing should be put between the original text and the inserted text</string>
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>122</width>
|
<width>726</width>
|
||||||
<height>38</height>
|
<height>334</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="testgrid">
|
<layout class="QGridLayout" name="testgrid">
|
||||||
|
@ -23,7 +23,7 @@ from calibre.gui2.dialogs.tag_editor import TagEditor
|
|||||||
from calibre.gui2.widgets import ProgressIndicator
|
from calibre.gui2.widgets import ProgressIndicator
|
||||||
from calibre.ebooks import BOOK_EXTENSIONS
|
from calibre.ebooks import BOOK_EXTENSIONS
|
||||||
from calibre.ebooks.metadata import string_to_authors, \
|
from calibre.ebooks.metadata import string_to_authors, \
|
||||||
authors_to_string, check_isbn
|
authors_to_string, check_isbn, title_sort
|
||||||
from calibre.ebooks.metadata.covers import download_cover
|
from calibre.ebooks.metadata.covers import download_cover
|
||||||
from calibre.ebooks.metadata.meta import get_metadata
|
from calibre.ebooks.metadata.meta import get_metadata
|
||||||
from calibre.ebooks.metadata import MetaInformation
|
from calibre.ebooks.metadata import MetaInformation
|
||||||
@ -34,6 +34,7 @@ from calibre.customize.ui import run_plugins_on_import, get_isbndb_key
|
|||||||
from calibre.gui2.preferences.social import SocialMetadata
|
from calibre.gui2.preferences.social import SocialMetadata
|
||||||
from calibre.gui2.custom_column_widgets import populate_metadata_page
|
from calibre.gui2.custom_column_widgets import populate_metadata_page
|
||||||
from calibre import strftime
|
from calibre import strftime
|
||||||
|
from calibre.library.comments import comments_to_html
|
||||||
|
|
||||||
class CoverFetcher(Thread): # {{{
|
class CoverFetcher(Thread): # {{{
|
||||||
|
|
||||||
@ -195,7 +196,6 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
_file + _(" is not a valid picture"))
|
_file + _(" is not a valid picture"))
|
||||||
d.exec_()
|
d.exec_()
|
||||||
else:
|
else:
|
||||||
self.cover_path.setText(_file)
|
|
||||||
self.cover.setPixmap(pix)
|
self.cover.setPixmap(pix)
|
||||||
self.update_cover_tooltip()
|
self.update_cover_tooltip()
|
||||||
self.cover_changed = True
|
self.cover_changed = True
|
||||||
@ -409,7 +409,8 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
if mi.series_index is not None:
|
if mi.series_index is not None:
|
||||||
self.series_index.setValue(float(mi.series_index))
|
self.series_index.setValue(float(mi.series_index))
|
||||||
if mi.comments and mi.comments.strip():
|
if mi.comments and mi.comments.strip():
|
||||||
self.comments.setPlainText(mi.comments)
|
comments = comments_to_html(mi.comments)
|
||||||
|
self.comments.html = comments
|
||||||
|
|
||||||
|
|
||||||
def sync_formats(self):
|
def sync_formats(self):
|
||||||
@ -444,13 +445,24 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
self.cover_fetcher = None
|
self.cover_fetcher = None
|
||||||
self.bc_box.layout().setAlignment(self.cover, Qt.AlignCenter|Qt.AlignHCenter)
|
self.bc_box.layout().setAlignment(self.cover, Qt.AlignCenter|Qt.AlignHCenter)
|
||||||
base = unicode(self.author_sort.toolTip())
|
base = unicode(self.author_sort.toolTip())
|
||||||
self.ok_aus_tooltip = '<p>' + textwrap.fill(base+'<br><br>'+
|
ok_tooltip = '<p>' + textwrap.fill(base+'<br><br>'+
|
||||||
_(' The green color indicates that the current '
|
_(' The green color indicates that the current '
|
||||||
'author sort matches the current author'))
|
'author sort matches the current author'))
|
||||||
self.bad_aus_tooltip = '<p>'+textwrap.fill(base + '<br><br>'+
|
bad_tooltip = '<p>'+textwrap.fill(base + '<br><br>'+
|
||||||
_(' The red color indicates that the current '
|
_(' The red color indicates that the current '
|
||||||
'author sort does not match the current author'))
|
'author sort does not match the current author. '
|
||||||
|
'No action is required if this is what you want.'))
|
||||||
|
self.aus_tooltips = (ok_tooltip, bad_tooltip)
|
||||||
|
|
||||||
|
base = unicode(self.title_sort.toolTip())
|
||||||
|
ok_tooltip = '<p>' + textwrap.fill(base+'<br><br>'+
|
||||||
|
_(' The green color indicates that the current '
|
||||||
|
'title sort matches the current title'))
|
||||||
|
bad_tooltip = '<p>'+textwrap.fill(base + '<br><br>'+
|
||||||
|
_(' The red color warns that the current '
|
||||||
|
'title sort does not match the current title. '
|
||||||
|
'No action is required if this is what you want.'))
|
||||||
|
self.ts_tooltips = (ok_tooltip, bad_tooltip)
|
||||||
self.row_delta = 0
|
self.row_delta = 0
|
||||||
if prev:
|
if prev:
|
||||||
self.prev_button = QPushButton(QIcon(I('back.png')), _('Previous'),
|
self.prev_button = QPushButton(QIcon(I('back.png')), _('Previous'),
|
||||||
@ -506,7 +518,13 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
self.remove_unused_series)
|
self.remove_unused_series)
|
||||||
QObject.connect(self.auto_author_sort, SIGNAL('clicked()'),
|
QObject.connect(self.auto_author_sort, SIGNAL('clicked()'),
|
||||||
self.deduce_author_sort)
|
self.deduce_author_sort)
|
||||||
|
QObject.connect(self.auto_title_sort, SIGNAL('clicked()'),
|
||||||
|
self.deduce_title_sort)
|
||||||
self.trim_cover_button.clicked.connect(self.trim_cover)
|
self.trim_cover_button.clicked.connect(self.trim_cover)
|
||||||
|
self.connect(self.title_sort, SIGNAL('textChanged(const QString&)'),
|
||||||
|
self.title_sort_box_changed)
|
||||||
|
self.connect(self.title, SIGNAL('textChanged(const QString&)'),
|
||||||
|
self.title_box_changed)
|
||||||
self.connect(self.author_sort, SIGNAL('textChanged(const QString&)'),
|
self.connect(self.author_sort, SIGNAL('textChanged(const QString&)'),
|
||||||
self.author_sort_box_changed)
|
self.author_sort_box_changed)
|
||||||
self.connect(self.authors, SIGNAL('editTextChanged(const QString&)'),
|
self.connect(self.authors, SIGNAL('editTextChanged(const QString&)'),
|
||||||
@ -523,6 +541,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
|
|
||||||
|
|
||||||
self.title.setText(db.title(row))
|
self.title.setText(db.title(row))
|
||||||
|
self.title_sort.setText(db.title_sort(row))
|
||||||
isbn = db.isbn(self.id, index_is_id=True)
|
isbn = db.isbn(self.id, index_is_id=True)
|
||||||
if not isbn:
|
if not isbn:
|
||||||
isbn = ''
|
isbn = ''
|
||||||
@ -538,7 +557,9 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
if rating > 0:
|
if rating > 0:
|
||||||
self.rating.setValue(int(rating/2.))
|
self.rating.setValue(int(rating/2.))
|
||||||
comments = self.db.comments(row)
|
comments = self.db.comments(row)
|
||||||
self.comments.setPlainText(comments if comments else '')
|
if comments and comments.strip():
|
||||||
|
comments = comments_to_html(comments)
|
||||||
|
self.comments.html = comments
|
||||||
cover = self.db.cover(row)
|
cover = self.db.cover(row)
|
||||||
pubdate = db.pubdate(self.id, index_is_id=True)
|
pubdate = db.pubdate(self.id, index_is_id=True)
|
||||||
self.pubdate.setDate(QDate(pubdate.year, pubdate.month,
|
self.pubdate.setDate(QDate(pubdate.year, pubdate.month,
|
||||||
@ -598,8 +619,8 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
w = self.central_widget.widget(1)
|
w = self.central_widget.widget(1)
|
||||||
layout = w.layout()
|
layout = w.layout()
|
||||||
self.custom_column_widgets, self.__cc_spacers = \
|
self.custom_column_widgets, self.__cc_spacers = \
|
||||||
populate_metadata_page(layout, self.db, self.id,
|
populate_metadata_page(layout, self.db, self.id, parent=w, bulk=False,
|
||||||
parent=w, bulk=False, two_column=True)
|
two_column=tweaks['metadata_single_use_2_cols_for_custom_fields'])
|
||||||
self.__custom_col_layouts = [layout]
|
self.__custom_col_layouts = [layout]
|
||||||
ans = self.custom_column_widgets
|
ans = self.custom_column_widgets
|
||||||
for i in range(len(ans)-1):
|
for i in range(len(ans)-1):
|
||||||
@ -610,27 +631,40 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
for c in range(2, len(ans[i].widgets), 2):
|
for c in range(2, len(ans[i].widgets), 2):
|
||||||
w.setTabOrder(ans[i].widgets[c-1], ans[i].widgets[c+1])
|
w.setTabOrder(ans[i].widgets[c-1], ans[i].widgets[c+1])
|
||||||
|
|
||||||
|
def title_box_changed(self, txt):
|
||||||
|
ts = unicode(txt)
|
||||||
|
ts = title_sort(ts)
|
||||||
|
self.mark_box_as_ok(control = self.title_sort, tt=self.ts_tooltips,
|
||||||
|
normal=(unicode(self.title_sort.text()) == ts))
|
||||||
|
|
||||||
|
def title_sort_box_changed(self, txt):
|
||||||
|
ts = unicode(txt)
|
||||||
|
self.mark_box_as_ok(control = self.title_sort, tt=self.ts_tooltips,
|
||||||
|
normal=(title_sort(unicode(self.title.text())) == ts))
|
||||||
|
|
||||||
def authors_box_changed(self, txt):
|
def authors_box_changed(self, txt):
|
||||||
aus = unicode(txt)
|
aus = unicode(txt)
|
||||||
aus = re.sub(r'\s+et al\.$', '', aus)
|
aus = re.sub(r'\s+et al\.$', '', aus)
|
||||||
aus = self.db.author_sort_from_authors(string_to_authors(aus))
|
aus = self.db.author_sort_from_authors(string_to_authors(aus))
|
||||||
self.mark_author_sort(normal=(unicode(self.author_sort.text()) == aus))
|
self.mark_box_as_ok(control = self.author_sort, tt=self.aus_tooltips,
|
||||||
|
normal=(unicode(self.author_sort.text()) == aus))
|
||||||
|
|
||||||
def author_sort_box_changed(self, txt):
|
def author_sort_box_changed(self, txt):
|
||||||
au = unicode(self.authors.text())
|
au = unicode(self.authors.text())
|
||||||
au = re.sub(r'\s+et al\.$', '', au)
|
au = re.sub(r'\s+et al\.$', '', au)
|
||||||
au = self.db.author_sort_from_authors(string_to_authors(au))
|
au = self.db.author_sort_from_authors(string_to_authors(au))
|
||||||
self.mark_author_sort(normal=(au == txt))
|
self.mark_box_as_ok(control = self.author_sort, tt=self.aus_tooltips,
|
||||||
|
normal=(au == txt))
|
||||||
|
|
||||||
def mark_author_sort(self, normal=True):
|
def mark_box_as_ok(self, control, tt, normal=True):
|
||||||
if normal:
|
if normal:
|
||||||
col = 'rgb(0, 255, 0, 20%)'
|
col = 'rgb(0, 255, 0, 20%)'
|
||||||
else:
|
else:
|
||||||
col = 'rgb(255, 0, 0, 20%)'
|
col = 'rgb(255, 0, 0, 20%)'
|
||||||
self.author_sort.setStyleSheet('QLineEdit { color: black; '
|
control.setStyleSheet('QLineEdit { color: black; '
|
||||||
'background-color: %s; }'%col)
|
'background-color: %s; }'%col)
|
||||||
tt = self.ok_aus_tooltip if normal else self.bad_aus_tooltip
|
tt = tt[0] if normal else tt[1]
|
||||||
self.author_sort.setToolTip(tt)
|
control.setToolTip(tt)
|
||||||
|
|
||||||
def validate_isbn(self, isbn):
|
def validate_isbn(self, isbn):
|
||||||
isbn = unicode(isbn).strip()
|
isbn = unicode(isbn).strip()
|
||||||
@ -652,12 +686,16 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
authors = string_to_authors(au)
|
authors = string_to_authors(au)
|
||||||
self.author_sort.setText(self.db.author_sort_from_authors(authors))
|
self.author_sort.setText(self.db.author_sort_from_authors(authors))
|
||||||
|
|
||||||
|
def deduce_title_sort(self):
|
||||||
|
ts = unicode(self.title.text())
|
||||||
|
self.title_sort.setText(title_sort(ts))
|
||||||
|
|
||||||
def swap_title_author(self):
|
def swap_title_author(self):
|
||||||
title = self.title.text()
|
title = self.title.text()
|
||||||
self.title.setText(self.authors.text())
|
self.title.setText(self.authors.text())
|
||||||
self.authors.setText(title)
|
self.authors.setText(title)
|
||||||
self.author_sort.setText('')
|
self.deduce_author_sort()
|
||||||
|
self.deduce_title_sort()
|
||||||
|
|
||||||
def initialize_combos(self):
|
def initialize_combos(self):
|
||||||
self.initalize_authors()
|
self.initalize_authors()
|
||||||
@ -771,10 +809,10 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
self.pubdate.setDate(QDate(dt.year, dt.month, dt.day))
|
self.pubdate.setDate(QDate(dt.year, dt.month, dt.day))
|
||||||
summ = book.comments
|
summ = book.comments
|
||||||
if summ:
|
if summ:
|
||||||
prefix = unicode(self.comments.toPlainText())
|
prefix = self.comment.html
|
||||||
if prefix:
|
if prefix:
|
||||||
prefix += '\n'
|
prefix += '\n'
|
||||||
self.comments.setPlainText(prefix + summ)
|
self.comments.html = prefix + comments_to_html(summ)
|
||||||
if book.rating is not None:
|
if book.rating is not None:
|
||||||
self.rating.setValue(int(book.rating))
|
self.rating.setValue(int(book.rating))
|
||||||
if book.tags:
|
if book.tags:
|
||||||
@ -804,7 +842,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
series = unicode(self.series.text()).strip()
|
series = unicode(self.series.text()).strip()
|
||||||
if series and series != self.original_series_name:
|
if series and series != self.original_series_name:
|
||||||
ns = 1
|
ns = 1
|
||||||
if tweaks['series_index_auto_increment'] == 'next':
|
if tweaks['series_index_auto_increment'] != 'const':
|
||||||
ns = self.db.get_next_series_num_for(series)
|
ns = self.db.get_next_series_num_for(series)
|
||||||
self.series_index.setValue(ns)
|
self.series_index.setValue(ns)
|
||||||
self.original_series_name = series
|
self.original_series_name = series
|
||||||
@ -838,6 +876,10 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
title = unicode(self.title.text()).strip()
|
title = unicode(self.title.text()).strip()
|
||||||
if title != self.original_title:
|
if title != self.original_title:
|
||||||
self.db.set_title(self.id, title, notify=False)
|
self.db.set_title(self.id, title, notify=False)
|
||||||
|
# This must be after setting the title because of the DB update trigger
|
||||||
|
ts = unicode(self.title_sort.text()).strip()
|
||||||
|
if ts:
|
||||||
|
self.db.set_title_sort(self.id, ts, notify=False, commit=False)
|
||||||
au = unicode(self.authors.text()).strip()
|
au = unicode(self.authors.text()).strip()
|
||||||
if au and au != self.original_author:
|
if au and au != self.original_author:
|
||||||
self.db.set_authors(self.id, string_to_authors(au), notify=False)
|
self.db.set_authors(self.id, string_to_authors(au), notify=False)
|
||||||
@ -860,7 +902,7 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
self.db.set_series_index(self.id, self.series_index.value(),
|
self.db.set_series_index(self.id, self.series_index.value(),
|
||||||
notify=False, commit=False)
|
notify=False, commit=False)
|
||||||
self.db.set_comment(self.id,
|
self.db.set_comment(self.id,
|
||||||
unicode(self.comments.toPlainText()).strip(),
|
self.comments.html,
|
||||||
notify=False, commit=False)
|
notify=False, commit=False)
|
||||||
d = self.pubdate.date()
|
d = self.pubdate.date()
|
||||||
d = qt_to_dt(d)
|
d = qt_to_dt(d)
|
||||||
@ -897,16 +939,16 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
QDialog.reject(self, *args)
|
QDialog.reject(self, *args)
|
||||||
|
|
||||||
def read_state(self):
|
def read_state(self):
|
||||||
wg = dynamic.get('metasingle_window_geometry', None)
|
wg = dynamic.get('metasingle_window_geometry2', None)
|
||||||
ss = dynamic.get('metasingle_splitter_state', None)
|
ss = dynamic.get('metasingle_splitter_state2', None)
|
||||||
if wg is not None:
|
if wg is not None:
|
||||||
self.restoreGeometry(wg)
|
self.restoreGeometry(wg)
|
||||||
if ss is not None:
|
if ss is not None:
|
||||||
self.splitter.restoreState(ss)
|
self.splitter.restoreState(ss)
|
||||||
|
|
||||||
def save_state(self):
|
def save_state(self):
|
||||||
dynamic.set('metasingle_window_geometry', bytes(self.saveGeometry()))
|
dynamic.set('metasingle_window_geometry2', bytes(self.saveGeometry()))
|
||||||
dynamic.set('metasingle_splitter_state',
|
dynamic.set('metasingle_splitter_state2',
|
||||||
bytes(self.splitter.saveState()))
|
bytes(self.splitter.saveState()))
|
||||||
|
|
||||||
def break_cycles(self):
|
def break_cycles(self):
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>887</width>
|
<width>994</width>
|
||||||
<height>750</height>
|
<height>726</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@ -43,8 +43,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>879</width>
|
<width>986</width>
|
||||||
<height>711</height>
|
<height>687</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||||
@ -66,8 +66,8 @@
|
|||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>&Basic metadata</string>
|
<string>&Basic metadata</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
<layout class="QGridLayout" name="gridLayout_5">
|
||||||
<item>
|
<item row="0" column="0">
|
||||||
<widget class="QSplitter" name="splitter">
|
<widget class="QSplitter" name="splitter">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
@ -100,27 +100,27 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="2" rowspan="2">
|
<item row="1" column="0">
|
||||||
<widget class="QToolButton" name="swap_button">
|
<widget class="QLabel" name="label">
|
||||||
<property name="toolTip">
|
|
||||||
<string>Swap the author and title</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>...</string>
|
<string>Title &sort: </string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="alignment">
|
||||||
<iconset resource="../../../../resources/images.qrc">
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
<normaloff>:/images/swap.png</normaloff>:/images/swap.png</iconset>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="iconSize">
|
<property name="buddy">
|
||||||
<size>
|
<cstring>title_sort</cstring>
|
||||||
<width>16</width>
|
|
||||||
<height>16</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="1">
|
||||||
|
<widget class="EnLineEdit" name="title_sort">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Specify how this book should be sorted when by title. For example, The Exorcist might be sorted as Exorcist, The.</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>&Author(s): </string>
|
<string>&Author(s): </string>
|
||||||
@ -133,7 +133,14 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="2" column="1">
|
||||||
|
<widget class="EnComboBox" name="authors">
|
||||||
|
<property name="editable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
<widget class="QLabel" name="label_8">
|
<widget class="QLabel" name="label_8">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Author S&ort: </string>
|
<string>Author S&ort: </string>
|
||||||
@ -146,9 +153,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1" colspan="2">
|
<item row="3" column="1">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="EnLineEdit" name="author_sort">
|
<widget class="EnLineEdit" name="author_sort">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Specify how the author(s) of this book should be sorted. For example Charles Dickens should be sorted as Dickens, Charles.
|
<string>Specify how the author(s) of this book should be sorted. For example Charles Dickens should be sorted as Dickens, Charles.
|
||||||
@ -156,24 +161,7 @@ If the box is colored green, then text matches the individual author's sort stri
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item row="4" column="0">
|
||||||
<widget class="QToolButton" name="auto_author_sort">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Automatically create the author sort entry based on the current author entry.
|
|
||||||
Using this button to create author sort will change author sort from red to green.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>...</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="../../../../resources/images.qrc">
|
|
||||||
<normaloff>:/images/auto_author_sort.png</normaloff>:/images/auto_author_sort.png</iconset>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QLabel" name="label_6">
|
<widget class="QLabel" name="label_6">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>&Rating:</string>
|
<string>&Rating:</string>
|
||||||
@ -186,7 +174,7 @@ Using this button to create author sort will change author sort from red to gree
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1" colspan="2">
|
<item row="4" column="1" colspan="2">
|
||||||
<widget class="QSpinBox" name="rating">
|
<widget class="QSpinBox" name="rating">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Rating of this book. 0-5 stars</string>
|
<string>Rating of this book. 0-5 stars</string>
|
||||||
@ -205,7 +193,7 @@ Using this button to create author sort will change author sort from red to gree
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="0">
|
<item row="5" column="0">
|
||||||
<widget class="QLabel" name="label_3">
|
<widget class="QLabel" name="label_3">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>&Publisher: </string>
|
<string>&Publisher: </string>
|
||||||
@ -218,7 +206,14 @@ Using this button to create author sort will change author sort from red to gree
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="5" column="1" colspan="2">
|
||||||
|
<widget class="EnComboBox" name="publisher">
|
||||||
|
<property name="editable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="0">
|
||||||
<widget class="QLabel" name="label_4">
|
<widget class="QLabel" name="label_4">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Ta&gs: </string>
|
<string>Ta&gs: </string>
|
||||||
@ -231,32 +226,7 @@ Using this button to create author sort will change author sort from red to gree
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1" colspan="2">
|
<item row="7" column="0">
|
||||||
<layout class="QHBoxLayout" name="_2">
|
|
||||||
<item>
|
|
||||||
<widget class="TagsLineEdit" name="tags">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Tags categorize the book. This is particularly useful while searching. <br><br>They can be any words or phrases, separated by commas.</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="tag_editor_button">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Open Tag Editor</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Open Tag Editor</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="../../../../resources/images.qrc">
|
|
||||||
<normaloff>:/images/chapters.png</normaloff>:/images/chapters.png</iconset>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="0">
|
|
||||||
<widget class="QLabel" name="label_7">
|
<widget class="QLabel" name="label_7">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>&Series:</string>
|
<string>&Series:</string>
|
||||||
@ -272,7 +242,7 @@ Using this button to create author sort will change author sort from red to gree
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="1" colspan="2">
|
<item row="7" column="1">
|
||||||
<layout class="QHBoxLayout" name="_3">
|
<layout class="QHBoxLayout" name="_3">
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>5</number>
|
<number>5</number>
|
||||||
@ -293,59 +263,9 @@ Using this button to create author sort will change author sort from red to gree
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="remove_series_button">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Remove unused series (Series that have no books)</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>...</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="../../../../resources/images.qrc">
|
|
||||||
<normaloff>:/images/trash.png</normaloff>:/images/trash.png</iconset>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="0">
|
|
||||||
<widget class="QLabel" name="label_9">
|
|
||||||
<property name="text">
|
|
||||||
<string>IS&BN:</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>isbn</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="1" colspan="2">
|
<item row="8" column="1" colspan="2">
|
||||||
<widget class="QLineEdit" name="isbn"/>
|
|
||||||
</item>
|
|
||||||
<item row="10" column="0">
|
|
||||||
<widget class="QLabel" name="label_10">
|
|
||||||
<property name="text">
|
|
||||||
<string>Publishe&d:</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>pubdate</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="1" colspan="2">
|
|
||||||
<widget class="EnComboBox" name="publisher">
|
|
||||||
<property name="editable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="7" column="1" colspan="2">
|
|
||||||
<widget class="QDoubleSpinBox" name="series_index">
|
<widget class="QDoubleSpinBox" name="series_index">
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
@ -358,34 +278,23 @@ Using this button to create author sort will change author sort from red to gree
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="1" colspan="2">
|
<item row="9" column="0">
|
||||||
<widget class="QDateEdit" name="pubdate">
|
<widget class="QLabel" name="label_9">
|
||||||
<property name="displayFormat">
|
<property name="text">
|
||||||
<string>MMM yyyy</string>
|
<string>IS&BN:</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="calendarPopup">
|
<property name="alignment">
|
||||||
<bool>true</bool>
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
<property name="buddy">
|
||||||
</item>
|
<cstring>isbn</cstring>
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="EnComboBox" name="authors">
|
|
||||||
<property name="editable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="1" colspan="2">
|
<item row="9" column="1" colspan="2">
|
||||||
<widget class="QDateEdit" name="date">
|
<widget class="QLineEdit" name="isbn"/>
|
||||||
<property name="displayFormat">
|
|
||||||
<string>dd MMM yyyy</string>
|
|
||||||
</property>
|
|
||||||
<property name="calendarPopup">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="0">
|
<item row="10" column="0">
|
||||||
<widget class="QLabel" name="label_11">
|
<widget class="QLabel" name="label_11">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>&Date:</string>
|
<string>&Date:</string>
|
||||||
@ -398,22 +307,181 @@ Using this button to create author sort will change author sort from red to gree
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
<item row="10" column="1" colspan="2">
|
||||||
|
<widget class="QDateEdit" name="date">
|
||||||
|
<property name="displayFormat">
|
||||||
|
<string>dd MMM yyyy</string>
|
||||||
|
</property>
|
||||||
|
<property name="calendarPopup">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="11" column="0">
|
||||||
|
<widget class="QLabel" name="label_10">
|
||||||
|
<property name="text">
|
||||||
|
<string>Publishe&d:</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>pubdate</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="11" column="1" colspan="2">
|
||||||
|
<widget class="QDateEdit" name="pubdate">
|
||||||
|
<property name="displayFormat">
|
||||||
|
<string>MMM yyyy</string>
|
||||||
|
</property>
|
||||||
|
<property name="calendarPopup">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2" rowspan="4">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_7">
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer_3">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="auto_title_sort">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Automatically create the title sort entry based on the current title entry.
|
||||||
|
Using this button to create title sort will change title sort from red to green.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>...</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../../../resources/images.qrc">
|
||||||
|
<normaloff>:/images/auto_author_sort.png</normaloff>:/images/auto_author_sort.png</iconset>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox_2">
|
<spacer name="verticalSpacer">
|
||||||
<property name="title">
|
<property name="orientation">
|
||||||
<string>&Comments</string>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_4">
|
<property name="sizeHint" stdset="0">
|
||||||
<item row="0" column="0">
|
<size>
|
||||||
<widget class="QTextEdit" name="comments">
|
<width>20</width>
|
||||||
<property name="tabChangesFocus">
|
<height>40</height>
|
||||||
<bool>true</bool>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="acceptRichText">
|
</spacer>
|
||||||
<bool>false</bool>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="swap_button">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Swap the author and title</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>...</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../../../resources/images.qrc">
|
||||||
|
<normaloff>:/images/swap.png</normaloff>:/images/swap.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>16</width>
|
||||||
|
<height>16</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="auto_author_sort">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Automatically create the author sort entry based on the current author entry.
|
||||||
|
Using this button to create author sort will change author sort from red to green.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>...</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../../../resources/images.qrc">
|
||||||
|
<normaloff>:/images/auto_author_sort.png</normaloff>:/images/auto_author_sort.png</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer_4">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="1">
|
||||||
|
<layout class="QHBoxLayout" name="_2">
|
||||||
|
<item>
|
||||||
|
<widget class="TagsLineEdit" name="tags">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Tags categorize the book. This is particularly useful while searching. <br><br>They can be any words or phrases, separated by commas.</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="2">
|
||||||
|
<widget class="QToolButton" name="tag_editor_button">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Open Tag Editor</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Open Tag Editor</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../../../resources/images.qrc">
|
||||||
|
<normaloff>:/images/chapters.png</normaloff>:/images/chapters.png</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="2">
|
||||||
|
<widget class="QToolButton" name="remove_series_button">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Remove unused series (Series that have no books)</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>...</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../../../resources/images.qrc">
|
||||||
|
<normaloff>:/images/trash.png</normaloff>:/images/trash.png</iconset>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@ -431,6 +499,128 @@ Using this button to create author sort will change author sort from red to gree
|
|||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="layoutWidget_2">
|
<widget class="QWidget" name="layoutWidget_2">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="bc_box">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>10</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Book Cover</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||||
|
<item>
|
||||||
|
<widget class="ImageView" name="cover" native="true">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>100</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="_4">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>6</number>
|
||||||
|
</property>
|
||||||
|
<property name="sizeConstraint">
|
||||||
|
<enum>QLayout::SetMaximumSize</enum>
|
||||||
|
</property>
|
||||||
|
<property name="margin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_5">
|
||||||
|
<property name="text">
|
||||||
|
<string>Change &cover image:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>cover_button</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="_5">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>6</number>
|
||||||
|
</property>
|
||||||
|
<property name="margin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="cover_button">
|
||||||
|
<property name="text">
|
||||||
|
<string>&Browse</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../../../resources/images.qrc">
|
||||||
|
<normaloff>:/images/document_open.png</normaloff>:/images/document_open.png</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="trim_cover_button">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Remove border (if any) from cover</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>T&rim</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../../../resources/images.qrc">
|
||||||
|
<normaloff>:/images/trim.png</normaloff>:/images/trim.png</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="reset_cover">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Reset cover to default</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&Remove</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../../../../resources/images.qrc">
|
||||||
|
<normaloff>:/images/trash.png</normaloff>:/images/trash.png</iconset>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="_6">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="fetch_cover_button">
|
||||||
|
<property name="text">
|
||||||
|
<string>Download co&ver</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="generate_cover_button">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Generate a default cover based on the title and author</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&Generate cover</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="layoutWidget">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="af_group_box">
|
<widget class="QGroupBox" name="af_group_box">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@ -459,6 +649,12 @@ Using this button to create author sort will change author sort from red to gree
|
|||||||
<height>140</height>
|
<height>140</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="baseSize">
|
||||||
|
<size>
|
||||||
|
<width>100</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="dragDropMode">
|
<property name="dragDropMode">
|
||||||
<enum>QAbstractItemView::DropOnly</enum>
|
<enum>QAbstractItemView::DropOnly</enum>
|
||||||
</property>
|
</property>
|
||||||
@ -557,129 +753,22 @@ Using this button to create author sort will change author sort from red to gree
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="bc_box">
|
<widget class="QGroupBox" name="groupBox">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>10</verstretch>
|
<verstretch>10</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Book Cover</string>
|
<string>&Comments</string>
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
|
||||||
<item>
|
|
||||||
<widget class="ImageView" name="cover" native="true">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>100</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="_4">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="sizeConstraint">
|
|
||||||
<enum>QLayout::SetMaximumSize</enum>
|
|
||||||
</property>
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_8">
|
||||||
<property name="margin">
|
<property name="margin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_5">
|
<widget class="Editor" name="comments" native="true"/>
|
||||||
<property name="text">
|
|
||||||
<string>Change &cover image:</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>cover_path</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="_5">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="margin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="cover_path">
|
|
||||||
<property name="readOnly">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="cover_button">
|
|
||||||
<property name="text">
|
|
||||||
<string>&Browse</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="../../../../resources/images.qrc">
|
|
||||||
<normaloff>:/images/document_open.png</normaloff>:/images/document_open.png</iconset>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="trim_cover_button">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Remove border (if any) from cover</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>T&rim</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="../../../../resources/images.qrc">
|
|
||||||
<normaloff>:/images/trim.png</normaloff>:/images/trim.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="toolButtonStyle">
|
|
||||||
<enum>Qt::ToolButtonTextBesideIcon</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="reset_cover">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Reset cover to default</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>...</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="../../../../resources/images.qrc">
|
|
||||||
<normaloff>:/images/trash.png</normaloff>:/images/trash.png</iconset>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="_6">
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="fetch_cover_button">
|
|
||||||
<property name="text">
|
|
||||||
<string>Download co&ver</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="generate_cover_button">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Generate a default cover based on the title and author</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>&Generate cover</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
@ -741,13 +830,21 @@ Using this button to create author sort will change author sort from red to gree
|
|||||||
<header>calibre/gui2/widgets.h</header>
|
<header>calibre/gui2/widgets.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>Editor</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header location="global">calibre/gui2/comments_editor.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<tabstops>
|
<tabstops>
|
||||||
<tabstop>title</tabstop>
|
<tabstop>title</tabstop>
|
||||||
|
<tabstop>auto_title_sort</tabstop>
|
||||||
|
<tabstop>title_sort</tabstop>
|
||||||
<tabstop>swap_button</tabstop>
|
<tabstop>swap_button</tabstop>
|
||||||
<tabstop>authors</tabstop>
|
<tabstop>authors</tabstop>
|
||||||
<tabstop>author_sort</tabstop>
|
|
||||||
<tabstop>auto_author_sort</tabstop>
|
<tabstop>auto_author_sort</tabstop>
|
||||||
|
<tabstop>author_sort</tabstop>
|
||||||
<tabstop>rating</tabstop>
|
<tabstop>rating</tabstop>
|
||||||
<tabstop>publisher</tabstop>
|
<tabstop>publisher</tabstop>
|
||||||
<tabstop>tags</tabstop>
|
<tabstop>tags</tabstop>
|
||||||
@ -758,20 +855,20 @@ Using this button to create author sort will change author sort from red to gree
|
|||||||
<tabstop>isbn</tabstop>
|
<tabstop>isbn</tabstop>
|
||||||
<tabstop>date</tabstop>
|
<tabstop>date</tabstop>
|
||||||
<tabstop>pubdate</tabstop>
|
<tabstop>pubdate</tabstop>
|
||||||
<tabstop>comments</tabstop>
|
|
||||||
<tabstop>fetch_metadata_button</tabstop>
|
<tabstop>fetch_metadata_button</tabstop>
|
||||||
<tabstop>add_format_button</tabstop>
|
|
||||||
<tabstop>remove_format_button</tabstop>
|
|
||||||
<tabstop>button_set_cover</tabstop>
|
<tabstop>button_set_cover</tabstop>
|
||||||
<tabstop>button_set_metadata</tabstop>
|
<tabstop>button_set_metadata</tabstop>
|
||||||
<tabstop>formats</tabstop>
|
<tabstop>formats</tabstop>
|
||||||
<tabstop>cover_path</tabstop>
|
<tabstop>add_format_button</tabstop>
|
||||||
|
<tabstop>remove_format_button</tabstop>
|
||||||
|
<tabstop>cover_button</tabstop>
|
||||||
|
<tabstop>trim_cover_button</tabstop>
|
||||||
<tabstop>reset_cover</tabstop>
|
<tabstop>reset_cover</tabstop>
|
||||||
<tabstop>fetch_cover_button</tabstop>
|
<tabstop>fetch_cover_button</tabstop>
|
||||||
<tabstop>generate_cover_button</tabstop>
|
<tabstop>generate_cover_button</tabstop>
|
||||||
|
<tabstop>button_box</tabstop>
|
||||||
<tabstop>scrollArea</tabstop>
|
<tabstop>scrollArea</tabstop>
|
||||||
<tabstop>central_widget</tabstop>
|
<tabstop>central_widget</tabstop>
|
||||||
<tabstop>button_box</tabstop>
|
|
||||||
</tabstops>
|
</tabstops>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="../../../../resources/images.qrc"/>
|
<include location="../../../../resources/images.qrc"/>
|
||||||
|
@ -772,7 +772,7 @@ class BooksModel(QAbstractTableModel): # {{{
|
|||||||
self.db.set_series_index(id, float(match.group(1)))
|
self.db.set_series_index(id, float(match.group(1)))
|
||||||
val = pat.sub('', val).strip()
|
val = pat.sub('', val).strip()
|
||||||
elif val:
|
elif val:
|
||||||
if tweaks['series_index_auto_increment'] == 'next':
|
if tweaks['series_index_auto_increment'] != 'const':
|
||||||
ni = self.db.get_next_series_num_for(val)
|
ni = self.db.get_next_series_num_for(val)
|
||||||
if ni != 1:
|
if ni != 1:
|
||||||
self.db.set_series_index(id, ni)
|
self.db.set_series_index(id, ni)
|
||||||
|
@ -254,6 +254,7 @@ def run_in_debug_mode(logpath=None):
|
|||||||
e = sys.executable if getattr(sys, 'frozen', False) else sys.argv[0]
|
e = sys.executable if getattr(sys, 'frozen', False) else sys.argv[0]
|
||||||
import tempfile, subprocess
|
import tempfile, subprocess
|
||||||
fd, logpath = tempfile.mkstemp('.txt')
|
fd, logpath = tempfile.mkstemp('.txt')
|
||||||
|
os.close(fd)
|
||||||
|
|
||||||
if hasattr(sys, 'frameworks_dir'):
|
if hasattr(sys, 'frameworks_dir'):
|
||||||
base = os.path.dirname(sys.frameworks_dir)
|
base = os.path.dirname(sys.frameworks_dir)
|
||||||
@ -265,7 +266,13 @@ def run_in_debug_mode(logpath=None):
|
|||||||
base, ext = os.path.splitext(e)
|
base, ext = os.path.splitext(e)
|
||||||
exe = base + '-debug' + ext
|
exe = base + '-debug' + ext
|
||||||
print 'Starting debug executable:', exe
|
print 'Starting debug executable:', exe
|
||||||
subprocess.Popen([exe, '--gui-debug', logpath], stdout=fd, stderr=fd)
|
creationflags = 0
|
||||||
|
if iswindows:
|
||||||
|
import win32process
|
||||||
|
creationflags = win32process.CREATE_NO_WINDOW
|
||||||
|
subprocess.Popen([exe, '--gui-debug', logpath], stdout=open(logpath, 'w'),
|
||||||
|
stderr=subprocess.STDOUT, stdin=open(os.devnull, 'r'),
|
||||||
|
creationflags=creationflags)
|
||||||
|
|
||||||
def run_gui(opts, args, actions, listener, app, gui_debug=None):
|
def run_gui(opts, args, actions, listener, app, gui_debug=None):
|
||||||
initialize_file_icon_provider()
|
initialize_file_icon_provider()
|
||||||
@ -299,7 +306,13 @@ def run_gui(opts, args, actions, listener, app, gui_debug=None):
|
|||||||
if runner.main.gui_debug is not None:
|
if runner.main.gui_debug is not None:
|
||||||
e = sys.executable if getattr(sys, 'frozen', False) else sys.argv[0]
|
e = sys.executable if getattr(sys, 'frozen', False) else sys.argv[0]
|
||||||
import subprocess
|
import subprocess
|
||||||
subprocess.Popen([e, '--show-gui-debug', runner.main.gui_debug])
|
creationflags = 0
|
||||||
|
if iswindows:
|
||||||
|
import win32process
|
||||||
|
creationflags = win32process.CREATE_NO_WINDOW
|
||||||
|
subprocess.Popen([e, '--show-gui-debug', runner.main.gui_debug],
|
||||||
|
creationflags=creationflags, stdout=open(os.devnull, 'w'),
|
||||||
|
stderr=subprocess.PIPE, stdin=open(os.devnull, 'r'))
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def cant_start(msg=_('If you are sure it is not running')+', ',
|
def cant_start(msg=_('If you are sure it is not running')+', ',
|
||||||
|
@ -18,6 +18,7 @@ from PyQt4.Qt import Qt, QTreeView, QApplication, pyqtSignal, \
|
|||||||
from calibre.ebooks.metadata import title_sort
|
from calibre.ebooks.metadata import title_sort
|
||||||
from calibre.gui2 import config, NONE
|
from calibre.gui2 import config, NONE
|
||||||
from calibre.library.field_metadata import TagsIcons, category_icon_map
|
from calibre.library.field_metadata import TagsIcons, category_icon_map
|
||||||
|
from calibre.utils.config import tweaks
|
||||||
from calibre.utils.icu import sort_key
|
from calibre.utils.icu import sort_key
|
||||||
from calibre.utils.search_query_parser import saved_searches
|
from calibre.utils.search_query_parser import saved_searches
|
||||||
from calibre.gui2 import error_dialog
|
from calibre.gui2 import error_dialog
|
||||||
@ -409,17 +410,31 @@ class TagTreeItem(object): # {{{
|
|||||||
return NONE
|
return NONE
|
||||||
|
|
||||||
def tag_data(self, role):
|
def tag_data(self, role):
|
||||||
if role == Qt.DisplayRole:
|
tag = self.tag
|
||||||
if self.tag.count == 0:
|
if tag.category == 'authors' and \
|
||||||
return QVariant('%s'%(self.tag.name))
|
tweaks['categories_use_field_for_author_name'] == 'author_sort':
|
||||||
|
name = tag.sort
|
||||||
|
tt_author = True
|
||||||
else:
|
else:
|
||||||
return QVariant('[%d] %s'%(self.tag.count, self.tag.name))
|
name = tag.name
|
||||||
|
tt_author = False
|
||||||
|
if role == Qt.DisplayRole:
|
||||||
|
if tag.count == 0:
|
||||||
|
return QVariant('%s'%(name))
|
||||||
|
else:
|
||||||
|
return QVariant('[%d] %s'%(tag.count, name))
|
||||||
if role == Qt.EditRole:
|
if role == Qt.EditRole:
|
||||||
return QVariant(self.tag.name)
|
return QVariant(tag.name)
|
||||||
if role == Qt.DecorationRole:
|
if role == Qt.DecorationRole:
|
||||||
return self.icon_state_map[self.tag.state]
|
return self.icon_state_map[tag.state]
|
||||||
if role == Qt.ToolTipRole and self.tag.tooltip is not None:
|
if role == Qt.ToolTipRole:
|
||||||
return QVariant(self.tag.tooltip)
|
if tt_author:
|
||||||
|
if tag.tooltip is not None:
|
||||||
|
return QVariant('(%s) %s'%(tag.name, tag.tooltip))
|
||||||
|
else:
|
||||||
|
return QVariant(tag.name)
|
||||||
|
if tag.tooltip is not None:
|
||||||
|
return QVariant(tag.tooltip)
|
||||||
return NONE
|
return NONE
|
||||||
|
|
||||||
def toggle(self):
|
def toggle(self):
|
||||||
|
@ -378,13 +378,16 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{
|
|||||||
def booklists(self):
|
def booklists(self):
|
||||||
return self.memory_view.model().db, self.card_a_view.model().db, self.card_b_view.model().db
|
return self.memory_view.model().db, self.card_a_view.model().db, self.card_b_view.model().db
|
||||||
|
|
||||||
def library_moved(self, newloc):
|
def library_moved(self, newloc, copy_structure=False):
|
||||||
if newloc is None: return
|
if newloc is None: return
|
||||||
|
default_prefs = None
|
||||||
try:
|
try:
|
||||||
olddb = self.library_view.model().db
|
olddb = self.library_view.model().db
|
||||||
|
if copy_structure:
|
||||||
|
default_prefs = olddb.prefs
|
||||||
except:
|
except:
|
||||||
olddb = None
|
olddb = None
|
||||||
db = LibraryDatabase2(newloc)
|
db = LibraryDatabase2(newloc, default_prefs=default_prefs)
|
||||||
if self.content_server is not None:
|
if self.content_server is not None:
|
||||||
self.content_server.set_database(db)
|
self.content_server.set_database(db)
|
||||||
self.library_path = newloc
|
self.library_path = newloc
|
||||||
|
@ -188,6 +188,7 @@ class Document(QWebPage):
|
|||||||
|
|
||||||
# Miscellaneous
|
# Miscellaneous
|
||||||
settings.setAttribute(QWebSettings.LinksIncludedInFocusChain, True)
|
settings.setAttribute(QWebSettings.LinksIncludedInFocusChain, True)
|
||||||
|
settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
|
||||||
self.set_user_stylesheet()
|
self.set_user_stylesheet()
|
||||||
self.misc_config()
|
self.misc_config()
|
||||||
|
|
||||||
|
@ -650,7 +650,8 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
|
|||||||
self.action_table_of_contents.setDisabled(not self.iterator.toc)
|
self.action_table_of_contents.setDisabled(not self.iterator.toc)
|
||||||
self.current_book_has_toc = bool(self.iterator.toc)
|
self.current_book_has_toc = bool(self.iterator.toc)
|
||||||
self.current_title = title
|
self.current_title = title
|
||||||
self.setWindowTitle(self.base_window_title+' - '+title)
|
self.setWindowTitle(self.base_window_title+' - '+title +
|
||||||
|
' [%s]'%os.path.splitext(pathtoebook)[1][1:].upper())
|
||||||
self.pos.setMaximum(sum(self.iterator.pages))
|
self.pos.setMaximum(sum(self.iterator.pages))
|
||||||
self.pos.setSuffix(' / %d'%sum(self.iterator.pages))
|
self.pos.setSuffix(' / %d'%sum(self.iterator.pages))
|
||||||
self.vertical_scrollbar.setMinimum(100)
|
self.vertical_scrollbar.setMinimum(100)
|
||||||
|
@ -243,7 +243,7 @@
|
|||||||
<action name="action_copy">
|
<action name="action_copy">
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset resource="../../../../resources/images.qrc">
|
<iconset resource="../../../../resources/images.qrc">
|
||||||
<normaloff>:/images/edit_copy.png</normaloff>:/images/edit_copy.png</iconset>
|
<normaloff>:/images/edit-copy.png</normaloff>:/images/edit-copy.png</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Copy to clipboard</string>
|
<string>Copy to clipboard</string>
|
||||||
|
@ -19,7 +19,6 @@ from calibre.gui2 import NONE, error_dialog, pixmap_to_data, gprefs
|
|||||||
from calibre.constants import isosx
|
from calibre.constants import isosx
|
||||||
from calibre.gui2.filename_pattern_ui import Ui_Form
|
from calibre.gui2.filename_pattern_ui import Ui_Form
|
||||||
from calibre import fit_image
|
from calibre import fit_image
|
||||||
from calibre.utils.fonts import fontconfig
|
|
||||||
from calibre.ebooks import BOOK_EXTENSIONS
|
from calibre.ebooks import BOOK_EXTENSIONS
|
||||||
from calibre.ebooks.metadata.meta import metadata_from_filename
|
from calibre.ebooks.metadata.meta import metadata_from_filename
|
||||||
from calibre.utils.config import prefs, XMLConfig
|
from calibre.utils.config import prefs, XMLConfig
|
||||||
@ -283,6 +282,7 @@ class FontFamilyModel(QAbstractListModel):
|
|||||||
|
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
QAbstractListModel.__init__(self, *args)
|
QAbstractListModel.__init__(self, *args)
|
||||||
|
from calibre.utils.fonts import fontconfig
|
||||||
try:
|
try:
|
||||||
self.families = fontconfig.find_font_families()
|
self.families = fontconfig.find_font_families()
|
||||||
except:
|
except:
|
||||||
|
@ -707,7 +707,7 @@ def parse_series_string(db, label, value):
|
|||||||
val = pat.sub('', val).strip()
|
val = pat.sub('', val).strip()
|
||||||
s_index = float(match.group(1))
|
s_index = float(match.group(1))
|
||||||
elif val:
|
elif val:
|
||||||
if tweaks['series_index_auto_increment'] == 'next':
|
if tweaks['series_index_auto_increment'] != 'const':
|
||||||
s_index = db.get_next_cc_series_num_for(val, label=label)
|
s_index = db.get_next_cc_series_num_for(val, label=label)
|
||||||
else:
|
else:
|
||||||
s_index = 1.0
|
s_index = 1.0
|
||||||
|
@ -8,12 +8,12 @@ __docformat__ = 'restructuredtext en'
|
|||||||
|
|
||||||
import json, re
|
import json, re
|
||||||
from functools import partial
|
from functools import partial
|
||||||
from math import floor
|
|
||||||
|
|
||||||
from calibre import prints
|
from calibre import prints
|
||||||
from calibre.constants import preferred_encoding
|
from calibre.constants import preferred_encoding
|
||||||
from calibre.library.field_metadata import FieldMetadata
|
from calibre.library.field_metadata import FieldMetadata
|
||||||
from calibre.utils.date import parse_date
|
from calibre.utils.date import parse_date
|
||||||
|
from calibre.utils.config import tweaks
|
||||||
|
|
||||||
class CustomColumns(object):
|
class CustomColumns(object):
|
||||||
|
|
||||||
@ -261,15 +261,15 @@ class CustomColumns(object):
|
|||||||
series_id = self.conn.get('SELECT id from %s WHERE value=?'%table,
|
series_id = self.conn.get('SELECT id from %s WHERE value=?'%table,
|
||||||
(series,), all=False)
|
(series,), all=False)
|
||||||
if series_id is None:
|
if series_id is None:
|
||||||
|
if isinstance(tweaks['series_index_auto_increment'], (int, float)):
|
||||||
|
return float(tweaks['series_index_auto_increment'])
|
||||||
return 1.0
|
return 1.0
|
||||||
# get the label of the associated series number table
|
series_indices = self.conn.get('''
|
||||||
series_num = self.conn.get('''
|
SELECT {lt}.extra FROM {lt}
|
||||||
SELECT MAX({lt}.extra) FROM {lt}
|
|
||||||
WHERE {lt}.book IN (SELECT book FROM {lt} where value=?)
|
WHERE {lt}.book IN (SELECT book FROM {lt} where value=?)
|
||||||
'''.format(lt=lt), (series_id,), all=False)
|
ORDER BY {lt}.extra
|
||||||
if series_num is None:
|
'''.format(lt=lt), (series_id,))
|
||||||
return 1.0
|
return self._get_next_series_num_for_list(series_indices)
|
||||||
return floor(series_num+1)
|
|
||||||
|
|
||||||
def all_custom(self, label=None, num=None):
|
def all_custom(self, label=None, num=None):
|
||||||
if label is not None:
|
if label is not None:
|
||||||
|
@ -8,7 +8,7 @@ The database used to store ebook metadata
|
|||||||
'''
|
'''
|
||||||
import os, sys, shutil, cStringIO, glob, time, functools, traceback, re
|
import os, sys, shutil, cStringIO, glob, time, functools, traceback, re
|
||||||
from itertools import repeat
|
from itertools import repeat
|
||||||
from math import floor
|
from math import ceil
|
||||||
from Queue import Queue
|
from Queue import Queue
|
||||||
|
|
||||||
from PyQt4.QtGui import QImage
|
from PyQt4.QtGui import QImage
|
||||||
@ -113,7 +113,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
|||||||
def exists_at(cls, path):
|
def exists_at(cls, path):
|
||||||
return path and os.path.exists(os.path.join(path, 'metadata.db'))
|
return path and os.path.exists(os.path.join(path, 'metadata.db'))
|
||||||
|
|
||||||
def __init__(self, library_path, row_factory=False):
|
def __init__(self, library_path, row_factory=False, default_prefs=None):
|
||||||
self.field_metadata = FieldMetadata()
|
self.field_metadata = FieldMetadata()
|
||||||
self.dirtied_queue = Queue()
|
self.dirtied_queue = Queue()
|
||||||
if not os.path.exists(library_path):
|
if not os.path.exists(library_path):
|
||||||
@ -127,10 +127,29 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
|||||||
if isinstance(self.dbpath, unicode) and not iswindows:
|
if isinstance(self.dbpath, unicode) and not iswindows:
|
||||||
self.dbpath = self.dbpath.encode(filesystem_encoding)
|
self.dbpath = self.dbpath.encode(filesystem_encoding)
|
||||||
|
|
||||||
|
apply_default_prefs = not os.path.exists(self.dbpath)
|
||||||
self.connect()
|
self.connect()
|
||||||
|
|
||||||
self.is_case_sensitive = not iswindows and not isosx and \
|
self.is_case_sensitive = not iswindows and not isosx and \
|
||||||
not os.path.exists(self.dbpath.replace('metadata.db', 'MeTAdAtA.dB'))
|
not os.path.exists(self.dbpath.replace('metadata.db', 'MeTAdAtA.dB'))
|
||||||
SchemaUpgrade.__init__(self)
|
SchemaUpgrade.__init__(self)
|
||||||
|
|
||||||
|
# if we are to copy the prefs and structure from some other DB, then
|
||||||
|
# we need to do it before we call initialize_dynamic
|
||||||
|
if apply_default_prefs and default_prefs is not None:
|
||||||
|
dbprefs = DBPrefs(self)
|
||||||
|
for key in default_prefs:
|
||||||
|
# be sure that prefs not to be copied are listed below
|
||||||
|
if key in ['news_to_be_synced']:
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
dbprefs[key] = default_prefs[key]
|
||||||
|
except:
|
||||||
|
pass # ignore options that don't exist anymore
|
||||||
|
fmvals = [f for f in default_prefs['field_metadata'].values() if f['is_custom']]
|
||||||
|
for f in fmvals:
|
||||||
|
self.create_custom_column(f['label'], f['name'], f['datatype'],
|
||||||
|
f['is_multiple'] is not None, f['is_editable'], f['display'])
|
||||||
self.initialize_dynamic()
|
self.initialize_dynamic()
|
||||||
|
|
||||||
def get_property(self, idx, index_is_id=False, loc=-1):
|
def get_property(self, idx, index_is_id=False, loc=-1):
|
||||||
@ -1109,6 +1128,14 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
|||||||
for l in list:
|
for l in list:
|
||||||
(id, val, sort_val) = (l[0], l[1], l[2])
|
(id, val, sort_val) = (l[0], l[1], l[2])
|
||||||
tids[category][val] = (id, sort_val)
|
tids[category][val] = (id, sort_val)
|
||||||
|
elif cat['datatype'] == 'series':
|
||||||
|
for l in list:
|
||||||
|
(id, val) = (l[0], l[1])
|
||||||
|
tids[category][val] = (id, title_sort(val))
|
||||||
|
elif cat['datatype'] == 'rating':
|
||||||
|
for l in list:
|
||||||
|
(id, val) = (l[0], l[1])
|
||||||
|
tids[category][val] = (id, '{0:05.2f}'.format(val))
|
||||||
else:
|
else:
|
||||||
for l in list:
|
for l in list:
|
||||||
(id, val) = (l[0], l[1])
|
(id, val) = (l[0], l[1])
|
||||||
@ -1237,12 +1264,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
|||||||
|
|
||||||
# sort the list
|
# sort the list
|
||||||
if sort == 'name':
|
if sort == 'name':
|
||||||
def get_sort_key(x):
|
kf = lambda x :sort_key(x.s)
|
||||||
sk = x.s
|
|
||||||
if isinstance(sk, unicode):
|
|
||||||
sk = sort_key(sk)
|
|
||||||
return sk
|
|
||||||
kf = get_sort_key
|
|
||||||
reverse=False
|
reverse=False
|
||||||
elif sort == 'popularity':
|
elif sort == 'popularity':
|
||||||
kf = lambda x: x.c
|
kf = lambda x: x.c
|
||||||
@ -1365,14 +1387,42 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
|||||||
series_id = self.conn.get('SELECT id from series WHERE name=?',
|
series_id = self.conn.get('SELECT id from series WHERE name=?',
|
||||||
(series,), all=False)
|
(series,), all=False)
|
||||||
if series_id is None:
|
if series_id is None:
|
||||||
|
if isinstance(tweaks['series_index_auto_increment'], (int, float)):
|
||||||
|
return float(tweaks['series_index_auto_increment'])
|
||||||
return 1.0
|
return 1.0
|
||||||
series_num = self.conn.get(
|
series_indices = self.conn.get(
|
||||||
('SELECT MAX(series_index) FROM books WHERE id IN '
|
('SELECT series_index FROM books WHERE id IN '
|
||||||
'(SELECT book FROM books_series_link where series=?)'),
|
'(SELECT book FROM books_series_link where series=?) '
|
||||||
(series_id,), all=False)
|
'ORDER BY series_index'),
|
||||||
if series_num is None:
|
(series_id,))
|
||||||
|
return self._get_next_series_num_for_list(series_indices)
|
||||||
|
|
||||||
|
def _get_next_series_num_for_list(self, series_indices):
|
||||||
|
if not series_indices:
|
||||||
|
if isinstance(tweaks['series_index_auto_increment'], (int, float)):
|
||||||
|
return float(tweaks['series_index_auto_increment'])
|
||||||
|
return 1.0
|
||||||
|
series_indices = [x[0] for x in series_indices]
|
||||||
|
if tweaks['series_index_auto_increment'] == 'next':
|
||||||
|
return series_indices[-1] + 1
|
||||||
|
if tweaks['series_index_auto_increment'] == 'first_free':
|
||||||
|
for i in range(1, 10000):
|
||||||
|
if i not in series_indices:
|
||||||
|
return i
|
||||||
|
# really shouldn't get here.
|
||||||
|
if tweaks['series_index_auto_increment'] == 'next_free':
|
||||||
|
for i in range(int(ceil(series_indices[0])), 10000):
|
||||||
|
if i not in series_indices:
|
||||||
|
return i
|
||||||
|
# really shouldn't get here.
|
||||||
|
if tweaks['series_index_auto_increment'] == 'last_free':
|
||||||
|
for i in range(int(ceil(series_indices[-1])), 0, -1):
|
||||||
|
if i not in series_indices:
|
||||||
|
return i
|
||||||
|
return series_indices[-1] + 1
|
||||||
|
if isinstance(tweaks['series_index_auto_increment'], (int, float)):
|
||||||
|
return float(tweaks['series_index_auto_increment'])
|
||||||
return 1.0
|
return 1.0
|
||||||
return floor(series_num+1)
|
|
||||||
|
|
||||||
def set(self, row, column, val):
|
def set(self, row, column, val):
|
||||||
'''
|
'''
|
||||||
@ -1565,6 +1615,20 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
|||||||
if notify:
|
if notify:
|
||||||
self.notify('metadata', [id])
|
self.notify('metadata', [id])
|
||||||
|
|
||||||
|
def set_title_sort(self, id, title_sort_, notify=True, commit=True):
|
||||||
|
if not title_sort_:
|
||||||
|
return False
|
||||||
|
if isbytestring(title_sort_):
|
||||||
|
title_sort_ = title_sort_.decode(preferred_encoding, 'replace')
|
||||||
|
self.conn.execute('UPDATE books SET sort=? WHERE id=?', (title_sort_, id))
|
||||||
|
self.data.set(id, self.FIELD_MAP['sort'], title_sort_, row_is_id=True)
|
||||||
|
self.dirtied([id], commit=False)
|
||||||
|
if commit:
|
||||||
|
self.conn.commit()
|
||||||
|
if notify:
|
||||||
|
self.notify('metadata', [id])
|
||||||
|
return True
|
||||||
|
|
||||||
def _set_title(self, id, title):
|
def _set_title(self, id, title):
|
||||||
if not title:
|
if not title:
|
||||||
return False
|
return False
|
||||||
@ -1746,18 +1810,17 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
|||||||
FROM books, books_series_link as lt
|
FROM books, books_series_link as lt
|
||||||
WHERE books.id = lt.book AND lt.series=?
|
WHERE books.id = lt.book AND lt.series=?
|
||||||
ORDER BY books.series_index''', (old_id,))
|
ORDER BY books.series_index''', (old_id,))
|
||||||
# Get the next series index
|
|
||||||
index = self.get_next_series_num_for(new_name)
|
|
||||||
# Now update the link table
|
# Now update the link table
|
||||||
self.conn.execute('''UPDATE books_series_link
|
self.conn.execute('''UPDATE books_series_link
|
||||||
SET series=?
|
SET series=?
|
||||||
WHERE series=?''',(new_id, old_id,))
|
WHERE series=?''',(new_id, old_id,))
|
||||||
# Now set the indices
|
# Now set the indices
|
||||||
for (book_id,) in books:
|
for (book_id,) in books:
|
||||||
|
# Get the next series index
|
||||||
|
index = self.get_next_series_num_for(new_name)
|
||||||
self.conn.execute('''UPDATE books
|
self.conn.execute('''UPDATE books
|
||||||
SET series_index=?
|
SET series_index=?
|
||||||
WHERE id=?''',(index, book_id,))
|
WHERE id=?''',(index, book_id,))
|
||||||
index = index + 1
|
|
||||||
self.dirty_books_referencing('series', new_id, commit=False)
|
self.dirty_books_referencing('series', new_id, commit=False)
|
||||||
self.conn.commit()
|
self.conn.commit()
|
||||||
|
|
||||||
@ -1907,7 +1970,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def cleanup_tags(cls, tags):
|
def cleanup_tags(cls, tags):
|
||||||
tags = [x.strip() for x in tags if x.strip()]
|
tags = [x.strip().replace(',', ';') for x in tags if x.strip()]
|
||||||
tags = [x.decode(preferred_encoding, 'replace') \
|
tags = [x.decode(preferred_encoding, 'replace') \
|
||||||
if isbytestring(x) else x for x in tags]
|
if isbytestring(x) else x for x in tags]
|
||||||
tags = [u' '.join(x.split()) for x in tags]
|
tags = [u' '.join(x.split()) for x in tags]
|
||||||
|
@ -427,5 +427,17 @@ class SchemaUpgrade(object):
|
|||||||
|
|
||||||
def upgrade_version_15(self):
|
def upgrade_version_15(self):
|
||||||
'Remove commas from tags'
|
'Remove commas from tags'
|
||||||
self.conn.execute("UPDATE tags SET name=REPLACE(name, ',', ';')")
|
self.conn.execute("UPDATE OR IGNORE tags SET name=REPLACE(name, ',', ';')")
|
||||||
|
self.conn.execute("UPDATE OR IGNORE tags SET name=REPLACE(name, ',', ';;')")
|
||||||
|
self.conn.execute("UPDATE OR IGNORE tags SET name=REPLACE(name, ',', '')")
|
||||||
|
|
||||||
|
def upgrade_version_16(self):
|
||||||
|
self.conn.executescript('''
|
||||||
|
DROP TRIGGER IF EXISTS books_update_trg;
|
||||||
|
CREATE TRIGGER books_update_trg
|
||||||
|
AFTER UPDATE ON books
|
||||||
|
BEGIN
|
||||||
|
UPDATE books SET sort=title_sort(NEW.title)
|
||||||
|
WHERE id=NEW.id AND OLD.title <> NEW.title;
|
||||||
|
END;
|
||||||
|
''')
|
||||||
|
@ -15,7 +15,7 @@ from calibre import isbytestring, force_unicode, fit_image, \
|
|||||||
prepare_string_for_xml as xml
|
prepare_string_for_xml as xml
|
||||||
from calibre.utils.ordered_dict import OrderedDict
|
from calibre.utils.ordered_dict import OrderedDict
|
||||||
from calibre.utils.filenames import ascii_filename
|
from calibre.utils.filenames import ascii_filename
|
||||||
from calibre.utils.config import prefs
|
from calibre.utils.config import prefs, tweaks
|
||||||
from calibre.utils.icu import sort_key
|
from calibre.utils.icu import sort_key
|
||||||
from calibre.utils.magick import Image
|
from calibre.utils.magick import Image
|
||||||
from calibre.library.comments import comments_to_html
|
from calibre.library.comments import comments_to_html
|
||||||
@ -151,6 +151,10 @@ def get_category_items(category, items, restriction, datatype, prefix): # {{{
|
|||||||
'<div>{1}</div>'
|
'<div>{1}</div>'
|
||||||
'<div>{2}</div></div>')
|
'<div>{2}</div></div>')
|
||||||
rating, rstring = render_rating(i.avg_rating, prefix)
|
rating, rstring = render_rating(i.avg_rating, prefix)
|
||||||
|
if i.category == 'authors' and \
|
||||||
|
tweaks['categories_use_field_for_author_name'] == 'author_sort':
|
||||||
|
name = xml(i.sort)
|
||||||
|
else:
|
||||||
name = xml(i.name)
|
name = xml(i.name)
|
||||||
if datatype == 'rating':
|
if datatype == 'rating':
|
||||||
name = xml(_('%d stars')%int(i.avg_rating))
|
name = xml(_('%d stars')%int(i.avg_rating))
|
||||||
|
@ -5,7 +5,7 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
|
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
import re, os
|
import re, os, posixpath
|
||||||
|
|
||||||
import cherrypy
|
import cherrypy
|
||||||
|
|
||||||
@ -88,17 +88,24 @@ class ContentServer(object):
|
|||||||
def static(self, name):
|
def static(self, name):
|
||||||
'Serves static content'
|
'Serves static content'
|
||||||
name = name.lower()
|
name = name.lower()
|
||||||
|
fname = posixpath.basename(name)
|
||||||
|
try:
|
||||||
cherrypy.response.headers['Content-Type'] = {
|
cherrypy.response.headers['Content-Type'] = {
|
||||||
'js' : 'text/javascript',
|
'js' : 'text/javascript',
|
||||||
'css' : 'text/css',
|
'css' : 'text/css',
|
||||||
'png' : 'image/png',
|
'png' : 'image/png',
|
||||||
'gif' : 'image/gif',
|
'gif' : 'image/gif',
|
||||||
'html' : 'text/html',
|
'html' : 'text/html',
|
||||||
'' : 'application/octet-stream',
|
}[fname.rpartition('.')[-1].lower()]
|
||||||
}[name.rpartition('.')[-1].lower()]
|
except KeyError:
|
||||||
|
raise cherrypy.HTTPError(404, '%r not a valid resource type'%name)
|
||||||
cherrypy.response.headers['Last-Modified'] = self.last_modified(self.build_time)
|
cherrypy.response.headers['Last-Modified'] = self.last_modified(self.build_time)
|
||||||
path = P('content_server/'+name)
|
basedir = os.path.abspath(P('content_server'))
|
||||||
if not os.path.exists(path):
|
path = os.path.join(basedir, name.replace('/', os.sep))
|
||||||
|
path = os.path.abspath(path)
|
||||||
|
if not path.startswith(basedir):
|
||||||
|
raise cherrypy.HTTPError(403, 'Access to %s is forbidden'%name)
|
||||||
|
if not os.path.exists(path) or not os.path.isfile(path):
|
||||||
raise cherrypy.HTTPError(404, '%s not found'%name)
|
raise cherrypy.HTTPError(404, '%s not found'%name)
|
||||||
if self.opts.develop:
|
if self.opts.develop:
|
||||||
lm = fromtimestamp(os.stat(path).st_mtime)
|
lm = fromtimestamp(os.stat(path).st_mtime)
|
||||||
|
@ -19,9 +19,10 @@ from calibre.ebooks.metadata import fmt_sidx
|
|||||||
from calibre.library.comments import comments_to_html
|
from calibre.library.comments import comments_to_html
|
||||||
from calibre.library.server import custom_fields_to_display
|
from calibre.library.server import custom_fields_to_display
|
||||||
from calibre.library.server.utils import format_tag_string, Offsets
|
from calibre.library.server.utils import format_tag_string, Offsets
|
||||||
from calibre import guess_type
|
from calibre import guess_type, prepare_string_for_xml as xml
|
||||||
from calibre.utils.icu import sort_key
|
from calibre.utils.icu import sort_key
|
||||||
from calibre.utils.ordered_dict import OrderedDict
|
from calibre.utils.ordered_dict import OrderedDict
|
||||||
|
from calibre.utils.config import tweaks
|
||||||
|
|
||||||
BASE_HREFS = {
|
BASE_HREFS = {
|
||||||
0 : '/stanza',
|
0 : '/stanza',
|
||||||
@ -113,8 +114,13 @@ def CATALOG_ENTRY(item, item_kind, base_href, version, updated,
|
|||||||
count = (_('%d books') if item.count > 1 else _('%d book'))%item.count
|
count = (_('%d books') if item.count > 1 else _('%d book'))%item.count
|
||||||
if ignore_count:
|
if ignore_count:
|
||||||
count = ''
|
count = ''
|
||||||
|
if item.category == 'authors' and \
|
||||||
|
tweaks['categories_use_field_for_author_name'] == 'author_sort':
|
||||||
|
name = xml(item.sort)
|
||||||
|
else:
|
||||||
|
name = xml(item.name)
|
||||||
return E.entry(
|
return E.entry(
|
||||||
TITLE(item.name + ('' if not add_kind else ' (%s)'%item_kind)),
|
TITLE(name + ('' if not add_kind else ' (%s)'%item_kind)),
|
||||||
ID(id_),
|
ID(id_),
|
||||||
UPDATED(updated),
|
UPDATED(updated),
|
||||||
E.content(count, type='text'),
|
E.content(count, type='text'),
|
||||||
@ -150,13 +156,13 @@ def ACQUISITION_ENTRY(item, version, db, updated, CFM, CKEYS, prefix):
|
|||||||
extra.append(_('RATING: %s<br />')%rating)
|
extra.append(_('RATING: %s<br />')%rating)
|
||||||
tags = item[FM['tags']]
|
tags = item[FM['tags']]
|
||||||
if tags:
|
if tags:
|
||||||
extra.append(_('TAGS: %s<br />')%format_tag_string(tags, ',',
|
extra.append(_('TAGS: %s<br />')%xml(format_tag_string(tags, ',',
|
||||||
ignore_max=True,
|
ignore_max=True,
|
||||||
no_tag_count=True))
|
no_tag_count=True)))
|
||||||
series = item[FM['series']]
|
series = item[FM['series']]
|
||||||
if series:
|
if series:
|
||||||
extra.append(_('SERIES: %s [%s]<br />')%\
|
extra.append(_('SERIES: %s [%s]<br />')%\
|
||||||
(series,
|
(xml(series),
|
||||||
fmt_sidx(float(item[FM['series_index']]))))
|
fmt_sidx(float(item[FM['series_index']]))))
|
||||||
for key in CKEYS:
|
for key in CKEYS:
|
||||||
mi = db.get_metadata(item[CFM['id']['rec_index']], index_is_id=True)
|
mi = db.get_metadata(item[CFM['id']['rec_index']], index_is_id=True)
|
||||||
@ -164,11 +170,11 @@ def ACQUISITION_ENTRY(item, version, db, updated, CFM, CKEYS, prefix):
|
|||||||
if val:
|
if val:
|
||||||
datatype = CFM[key]['datatype']
|
datatype = CFM[key]['datatype']
|
||||||
if datatype == 'text' and CFM[key]['is_multiple']:
|
if datatype == 'text' and CFM[key]['is_multiple']:
|
||||||
extra.append('%s: %s<br />'%(name, format_tag_string(val, ',',
|
extra.append('%s: %s<br />'%(xml(name), xml(format_tag_string(val, ',',
|
||||||
ignore_max=True,
|
ignore_max=True,
|
||||||
no_tag_count=True)))
|
no_tag_count=True))))
|
||||||
else:
|
else:
|
||||||
extra.append('%s: %s<br />'%(name, val))
|
extra.append('%s: %s<br />'%(xml(name), xml(unicode(val))))
|
||||||
comments = item[FM['comments']]
|
comments = item[FM['comments']]
|
||||||
if comments:
|
if comments:
|
||||||
comments = comments_to_html(comments)
|
comments = comments_to_html(comments)
|
||||||
|
@ -161,9 +161,6 @@ class DBThread(Thread):
|
|||||||
self.conn.create_aggregate('sort_concat', 2, SafeSortedConcatenate)
|
self.conn.create_aggregate('sort_concat', 2, SafeSortedConcatenate)
|
||||||
self.conn.create_collation('PYNOCASE', partial(pynocase,
|
self.conn.create_collation('PYNOCASE', partial(pynocase,
|
||||||
encoding=encoding))
|
encoding=encoding))
|
||||||
if tweaks['title_series_sorting'] == 'strictly_alphabetic':
|
|
||||||
self.conn.create_function('title_sort', 1, lambda x:x)
|
|
||||||
else:
|
|
||||||
self.conn.create_function('title_sort', 1, title_sort)
|
self.conn.create_function('title_sort', 1, title_sort)
|
||||||
self.conn.create_function('author_to_author_sort', 1,
|
self.conn.create_function('author_to_author_sort', 1,
|
||||||
_author_to_author_sort)
|
_author_to_author_sort)
|
||||||
|
@ -541,7 +541,9 @@ Use the options to remove headers and footers to mitigate this issue. If the hea
|
|||||||
removed from the text it can throw off the paragraph unwrapping.
|
removed from the text it can throw off the paragraph unwrapping.
|
||||||
|
|
||||||
Some limitations of PDF input is complex, multi-column, and image based documents are not supported.
|
Some limitations of PDF input is complex, multi-column, and image based documents are not supported.
|
||||||
Extraction of vector images and tables from within the document is also not supported.
|
Extraction of vector images and tables from within the document is also not supported. Some PDFs use special glyphs to
|
||||||
|
represent double ll or doubfle ff or fi,etc. Conversion of these may or may not work depending on jusy how they are
|
||||||
|
represented internally in the PDF.
|
||||||
|
|
||||||
Comic Book Collections
|
Comic Book Collections
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -8,13 +8,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre\n"
|
"Project-Id-Version: calibre\n"
|
||||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-14 19:28+0000\n"
|
"PO-Revision-Date: 2010-12-16 22:50+0000\n"
|
||||||
"Last-Translator: Kenan Dervišević <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Bosnian <bs@li.org>\n"
|
"Language-Team: Bosnian <bs@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-15 04:35+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:42+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
||||||
|
@ -11,13 +11,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: ca\n"
|
"Project-Id-Version: ca\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-13 17:37+0000\n"
|
"PO-Revision-Date: 2010-12-16 23:54+0000\n"
|
||||||
"Last-Translator: FerranRius <frius64@hotmail.com>\n"
|
"Last-Translator: FerranRius <frius64@hotmail.com>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-14 04:50+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:42+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
||||||
|
@ -8,13 +8,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre\n"
|
"Project-Id-Version: calibre\n"
|
||||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-11 22:59+0000\n"
|
"PO-Revision-Date: 2010-12-17 00:31+0000\n"
|
||||||
"Last-Translator: Glenn <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Danish <da@li.org>\n"
|
"Language-Team: Danish <da@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-13 04:57+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:42+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
||||||
|
@ -8,13 +8,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: de\n"
|
"Project-Id-Version: de\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-11 02:44+0000\n"
|
"PO-Revision-Date: 2010-12-16 12:49+0000\n"
|
||||||
"Last-Translator: Kovid Goyal <Unknown>\n"
|
"Last-Translator: Manichean <Unknown>\n"
|
||||||
"Language-Team: American English <kde-i18n-doc@lists.kde.org>\n"
|
"Language-Team: American English <kde-i18n-doc@lists.kde.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-12 04:35+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:43+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
"Generated-By: pygettext.py 1.5\n"
|
"Generated-By: pygettext.py 1.5\n"
|
||||||
|
|
||||||
@ -2470,23 +2470,23 @@ msgstr "Comic"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:26
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:26
|
||||||
msgid "Downloads metadata from amazon.fr"
|
msgid "Downloads metadata from amazon.fr"
|
||||||
msgstr ""
|
msgstr "Herunterladen der Metadaten von amazon.fr"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:43
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:43
|
||||||
msgid "Downloads metadata from amazon.com in spanish"
|
msgid "Downloads metadata from amazon.com in spanish"
|
||||||
msgstr ""
|
msgstr "Herunterladen der spanischen Metadaten von amazon.com"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:60
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:60
|
||||||
msgid "Downloads metadata from amazon.com in english"
|
msgid "Downloads metadata from amazon.com in english"
|
||||||
msgstr ""
|
msgstr "Herunterladen der englischen Metadaten von amazon.com"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:77
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:77
|
||||||
msgid "Downloads metadata from amazon.de"
|
msgid "Downloads metadata from amazon.de"
|
||||||
msgstr ""
|
msgstr "Herunterladen der Metadaten von amazon.de"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:94
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:94
|
||||||
msgid "Downloads metadata from amazon.com"
|
msgid "Downloads metadata from amazon.com"
|
||||||
msgstr ""
|
msgstr "Herunterladen der Metadaten von amazon.com"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:474
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/amazonfr.py:474
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -2500,6 +2500,14 @@ msgid ""
|
|||||||
" All & english & french & german & spanish\n"
|
" All & english & french & german & spanish\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
" %prog [Optionen]\n"
|
||||||
|
"\n"
|
||||||
|
" Lädt Metadaten von Amazon. Sie müssen einen Titel, Author,\n"
|
||||||
|
" ISBN, Herausgeber oder Stichwort angeben. Es werden maximal\n"
|
||||||
|
" 10 Treffer geladen, suchen Sie so spezifisch wie möglich.\n"
|
||||||
|
" Sie können die Sprache für die Metadaten auswählen:\n"
|
||||||
|
" Alle & Englisch & Französisch & Deutsch & Spanisch\n"
|
||||||
|
" "
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:41
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/archive.py:41
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -2832,33 +2840,35 @@ msgstr "Lädt Reihe/Etiketten/Bewertung von librarything.com"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:25
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:25
|
||||||
msgid "Downloads metadata from Fictionwise"
|
msgid "Downloads metadata from Fictionwise"
|
||||||
msgstr ""
|
msgstr "Herunterladen der Metadaten von Fictionwise"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:90
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:90
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:108
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:108
|
||||||
msgid "Query: %s"
|
msgid "Query: %s"
|
||||||
msgstr ""
|
msgstr "Abfrage: %s"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:100
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:100
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:285
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:285
|
||||||
msgid "Fictionwise timed out. Try again later."
|
msgid "Fictionwise timed out. Try again later."
|
||||||
msgstr ""
|
msgstr "Timeout bei Fictionwise. Bitte später nochmal versuchen."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:101
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:101
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:286
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:286
|
||||||
msgid "Fictionwise encountered an error."
|
msgid "Fictionwise encountered an error."
|
||||||
msgstr ""
|
msgstr "Bei Fictionwise ist ein Fehler aufgetreten."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:219
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:219
|
||||||
msgid ""
|
msgid ""
|
||||||
"SUMMARY:\n"
|
"SUMMARY:\n"
|
||||||
" %s"
|
" %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"INHALTSANGABE:\n"
|
||||||
|
" %s"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:316
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:316
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:333
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:333
|
||||||
msgid "Failed to get all details for an entry"
|
msgid "Failed to get all details for an entry"
|
||||||
msgstr ""
|
msgstr "Konnte für einen Eintrag nicht alle Details holen"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:354
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:354
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -2871,41 +2881,49 @@ msgid ""
|
|||||||
" so you should make your query as specific as possible.\n"
|
" so you should make your query as specific as possible.\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
" %prog [Optionen]\n"
|
||||||
|
"\n"
|
||||||
|
" Holt Metadaten von Fictionwise. Sie müssen einen Titel, Autor oder "
|
||||||
|
"Stichwort\n"
|
||||||
|
" angeben. Angabe einer ISBN ist nicht möglich. Maximal werden 20 "
|
||||||
|
"Treffer geholt,\n"
|
||||||
|
" suchen Sie also möglichst spezifisch.\n"
|
||||||
|
" "
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:362
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:362
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:363
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:363
|
||||||
msgid "Book title"
|
msgid "Book title"
|
||||||
msgstr ""
|
msgstr "Titel"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:363
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:363
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:364
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:364
|
||||||
msgid "Book author(s)"
|
msgid "Book author(s)"
|
||||||
msgstr ""
|
msgstr "Autor(en)"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:364
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:364
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:365
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:365
|
||||||
msgid "Book publisher"
|
msgid "Book publisher"
|
||||||
msgstr ""
|
msgstr "Herausgeber"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:365
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:365
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:367
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:367
|
||||||
msgid "Keywords"
|
msgid "Keywords"
|
||||||
msgstr ""
|
msgstr "Schlüsselworte"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:367
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:367
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:373
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:373
|
||||||
msgid "Maximum number of results to fetch"
|
msgid "Maximum number of results to fetch"
|
||||||
msgstr ""
|
msgstr "Maximale Anzahl an zu holenden Ergebnissen"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:369
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:369
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:375
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:375
|
||||||
msgid "Be more verbose about errors"
|
msgid "Be more verbose about errors"
|
||||||
msgstr ""
|
msgstr "Fehler ausführlicher berichten"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:383
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/fictionwise.py:383
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:390
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:390
|
||||||
msgid "No result found for this search!"
|
msgid "No result found for this search!"
|
||||||
msgstr ""
|
msgstr "Keine Ergebnisse für diese Suche gefunden!"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/isbndb.py:107
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -2983,11 +3001,11 @@ msgstr "Timeout von Nicebooks. Bitte versuchen Sie es später nochmal."
|
|||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:119
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:119
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:243
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:243
|
||||||
msgid "Nicebooks encountered an error."
|
msgid "Nicebooks encountered an error."
|
||||||
msgstr ""
|
msgstr "Bei Nicebooks ist ein Fehler aufgetreten."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:323
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:323
|
||||||
msgid "ISBN: %s not found."
|
msgid "ISBN: %s not found."
|
||||||
msgstr ""
|
msgstr "ISBN: %s nicht gefunden."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:324
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:324
|
||||||
msgid "An errror occured with Nicebooks cover fetcher"
|
msgid "An errror occured with Nicebooks cover fetcher"
|
||||||
@ -3007,7 +3025,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:366
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:366
|
||||||
msgid "Book ISBN"
|
msgid "Book ISBN"
|
||||||
msgstr ""
|
msgstr "ISBN"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:369
|
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/nicebooks.py:369
|
||||||
msgid "Covers: 1-Check/ 2-Download"
|
msgid "Covers: 1-Check/ 2-Download"
|
||||||
|
@ -8,13 +8,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre\n"
|
"Project-Id-Version: calibre\n"
|
||||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-12 17:20+0000\n"
|
"PO-Revision-Date: 2010-12-16 23:27+0000\n"
|
||||||
"Last-Translator: Vladimir Oka <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
|
"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-13 04:58+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:45+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
||||||
|
@ -8,13 +8,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre\n"
|
"Project-Id-Version: calibre\n"
|
||||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-15 17:49+0000\n"
|
"PO-Revision-Date: 2010-12-16 23:28+0000\n"
|
||||||
"Last-Translator: gorkaazk <gorkaazkarate@euskalerria.org>\n"
|
"Last-Translator: gorkaazk <gorkaazkarate@euskalerria.org>\n"
|
||||||
"Language-Team: Basque <eu@li.org>\n"
|
"Language-Team: Basque <eu@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-16 04:32+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:42+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
||||||
|
@ -8,13 +8,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre 0.4.22\n"
|
"Project-Id-Version: calibre 0.4.22\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-16 02:50+0000\n"
|
"PO-Revision-Date: 2010-12-16 23:44+0000\n"
|
||||||
"Last-Translator: sengian <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Français <kde-i18n-doc@kde.org>\n"
|
"Language-Team: Français <kde-i18n-doc@kde.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-16 04:33+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:43+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
"X-Poedit-Bookmarks: 1177,1104,-1,-1,-1,-1,-1,-1,-1,-1\n"
|
"X-Poedit-Bookmarks: 1177,1104,-1,-1,-1,-1,-1,-1,-1,-1\n"
|
||||||
"Generated-By: pygettext.py 1.5\n"
|
"Generated-By: pygettext.py 1.5\n"
|
||||||
|
@ -8,13 +8,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre\n"
|
"Project-Id-Version: calibre\n"
|
||||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-15 12:01+0000\n"
|
"PO-Revision-Date: 2010-12-17 00:16+0000\n"
|
||||||
"Last-Translator: Miguel Anxo Bouzada <mbouzada@gmail.com>\n"
|
"Last-Translator: Miguel Anxo Bouzada <mbouzada@gmail.com>\n"
|
||||||
"Language-Team: dev@gl.openoffice.org\n"
|
"Language-Team: dev@gl.openoffice.org\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-16 04:33+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:43+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
"Language: gl\n"
|
"Language: gl\n"
|
||||||
|
|
||||||
@ -406,8 +406,8 @@ msgid ""
|
|||||||
"Setup sharing of books via email. Can be used for automatic sending of "
|
"Setup sharing of books via email. Can be used for automatic sending of "
|
||||||
"downloaded news to your devices"
|
"downloaded news to your devices"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Configura a compartición de libros por correo electrónico. Pódese usar para "
|
"Configura a compartición de libros por correo. Pódese usar para enviar "
|
||||||
"enviar automaticamente as noticias descargadas aos seus dispositivos"
|
"automaticamente as noticias descargadas aos seus dispositivos"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855
|
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:855
|
||||||
msgid "Sharing over the net"
|
msgid "Sharing over the net"
|
||||||
@ -8751,7 +8751,7 @@ msgstr "Código fonte das receitas (pytom)"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/email.py:145
|
#: /home/kovid/work/calibre/src/calibre/gui2/email.py:145
|
||||||
msgid "Email %s to %s"
|
msgid "Email %s to %s"
|
||||||
msgstr "Enviar por correo electrónico %s a %s"
|
msgstr "Enviar por correo %s a %s"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/email.py:187
|
#: /home/kovid/work/calibre/src/calibre/gui2/email.py:187
|
||||||
msgid "News:"
|
msgid "News:"
|
||||||
@ -9932,13 +9932,13 @@ msgid ""
|
|||||||
"automatically sent for downloaded news to all email addresses that have Auto-"
|
"automatically sent for downloaded news to all email addresses that have Auto-"
|
||||||
"send checked."
|
"send checked."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"O Calibre pode enviarlle os libros por correo-e. Enviaránselle correos "
|
"O Calibre pode enviarlle os libros por correo. Enviaránselle correos "
|
||||||
"automaticamente coas novas descargadas que teñen marcada a opción Enviar "
|
"automaticamente coas novas descargadas que teñen marcada a opción Enviar "
|
||||||
"automaticamente."
|
"automaticamente."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:67
|
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:67
|
||||||
msgid "Add an email address to which to send books"
|
msgid "Add an email address to which to send books"
|
||||||
msgstr "Engadir un enderezo de correo electrónico ao que enviar os libros"
|
msgstr "Engadir un enderezo de correo ao que enviar os libros"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:68
|
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/email_ui.py:68
|
||||||
msgid "&Add email"
|
msgid "&Add email"
|
||||||
@ -9958,7 +9958,7 @@ msgstr "Enviar automaticamente"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24
|
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:24
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "Correo electrónico"
|
msgstr "Correo"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:29
|
#: /home/kovid/work/calibre/src/calibre/gui2/preferences/emailp.py:29
|
||||||
msgid "Formats to email. The first matching format will be sent."
|
msgid "Formats to email. The first matching format will be sent."
|
||||||
@ -11668,15 +11668,14 @@ msgid ""
|
|||||||
"button below. You will also have to register your gmail address in your "
|
"button below. You will also have to register your gmail address in your "
|
||||||
"Amazon account."
|
"Amazon account."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"<p>Calibre pode enviar libros automaticamente por correo electrónico ao seu "
|
"<p>Calibre pode enviar libros automaticamente por correo ao seu Kindle. Debe "
|
||||||
"Kindle. Debe configurar o envío por correo electrónico. A forma más doada e "
|
"configurar o envío por correo. A forma más doada e facerse cunha <a "
|
||||||
"facerse cunha <a href=\"http://gmail.com\">conta gratuíta de Gmail</a> e "
|
"href=\"http://gmail.com\">conta gratuíta de Gmail</a> e premer o botón Usar "
|
||||||
"premer o botón Usar gmail. Tamén deberá rexistrar o enderezo de gmail na súa "
|
"gmail. Tamén deberá rexistrar o enderezo de gmail na súa conta de Amazon."
|
||||||
"conta de Amazon."
|
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:50
|
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/kindle_ui.py:50
|
||||||
msgid "&Kindle email:"
|
msgid "&Kindle email:"
|
||||||
msgstr "Correo electrónico do &Kindle:"
|
msgstr "Correo do &Kindle:"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:57
|
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/library_ui.py:57
|
||||||
msgid "Choose your &language:"
|
msgid "Choose your &language:"
|
||||||
@ -11765,7 +11764,7 @@ msgstr "Configuración errada"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:197
|
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:197
|
||||||
msgid "You must set the From email address"
|
msgid "You must set the From email address"
|
||||||
msgstr "Debe estabelecer o enderezo de correo-e remitente"
|
msgstr "Debe estabelecer o enderezo de correo remitente"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:204
|
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email.py:204
|
||||||
msgid "You must set the username and password for the mail server."
|
msgid "You must set the username and password for the mail server."
|
||||||
@ -11781,8 +11780,8 @@ msgid ""
|
|||||||
"<p>This is what will be present in the From: field of emails sent by "
|
"<p>This is what will be present in the From: field of emails sent by "
|
||||||
"calibre.<br> Set it to your email address"
|
"calibre.<br> Set it to your email address"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"<p>Isto é o que se mostrará no campo De: dos correos electrónicos enviados "
|
"<p>Isto é o que se mostrará no campo De: dos correos enviados por "
|
||||||
"por Calibre.<br>Poña o seu enderezo de correo-e."
|
"Calibre.<br>Poña o seu enderezo de correo."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:126
|
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:126
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@ -9,13 +9,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre_calibre-it\n"
|
"Project-Id-Version: calibre_calibre-it\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-12 08:58+0000\n"
|
"PO-Revision-Date: 2010-12-16 23:08+0000\n"
|
||||||
"Last-Translator: MeltingShell <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: italiano\n"
|
"Language-Team: italiano\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-13 04:57+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:43+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,1105,-1,1312,-1,-1\n"
|
"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,1105,-1,1312,-1,-1\n"
|
||||||
"Generated-By: pygettext.py 1.5\n"
|
"Generated-By: pygettext.py 1.5\n"
|
||||||
|
@ -8,13 +8,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre\n"
|
"Project-Id-Version: calibre\n"
|
||||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-12 12:28+0000\n"
|
"PO-Revision-Date: 2010-12-16 23:11+0000\n"
|
||||||
"Last-Translator: Hiroshi Miura <miurahr@linux.com>\n"
|
"Last-Translator: Hiroshi Miura <miurahr@linux.com>\n"
|
||||||
"Language-Team: Japanese <ja@li.org>\n"
|
"Language-Team: Japanese <ja@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-13 04:58+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:44+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
||||||
|
@ -8,13 +8,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre\n"
|
"Project-Id-Version: calibre\n"
|
||||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-11 02:28+0000\n"
|
"PO-Revision-Date: 2010-12-17 01:06+0000\n"
|
||||||
"Last-Translator: Namsik Chu <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Korean <ko@li.org>\n"
|
"Language-Team: Korean <ko@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-12 04:37+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:44+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
||||||
|
@ -8,13 +8,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre\n"
|
"Project-Id-Version: calibre\n"
|
||||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-16 03:36+0000\n"
|
"PO-Revision-Date: 2010-12-16 23:06+0000\n"
|
||||||
"Last-Translator: geordee <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Malayalam <ml@li.org>\n"
|
"Language-Team: Malayalam <ml@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-16 04:33+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:44+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
||||||
|
@ -8,13 +8,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre\n"
|
"Project-Id-Version: calibre\n"
|
||||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-05 04:33+0000\n"
|
"PO-Revision-Date: 2010-12-16 16:26+0000\n"
|
||||||
"Last-Translator: Wespa Digital <Unknown>\n"
|
"Last-Translator: marco cunha <Unknown>\n"
|
||||||
"Language-Team: American English <kde-i18n-doc@kde.org>\n"
|
"Language-Team: American English <kde-i18n-doc@kde.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-11 04:44+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:45+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
||||||
@ -387,7 +387,7 @@ msgstr "Configuração dos Metadados"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838
|
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:838
|
||||||
msgid "Change metadata fields before saving/sending"
|
msgid "Change metadata fields before saving/sending"
|
||||||
msgstr ""
|
msgstr "Alterar campos de metadados antes de salvar / enviar"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843
|
#: /home/kovid/work/calibre/src/calibre/customize/builtins.py:843
|
||||||
msgid "Sharing books by email"
|
msgid "Sharing books by email"
|
||||||
@ -582,6 +582,7 @@ msgstr "Destinado ao iPad e dispositivos similares com resolução de 768x1024"
|
|||||||
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:437
|
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:437
|
||||||
msgid "Intended for generic tablet devices, does no resizing of images"
|
msgid "Intended for generic tablet devices, does no resizing of images"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Pretendido para dispositivos Tablets, não faz o redimensionamento de imagens"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:464
|
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:464
|
||||||
msgid "This profile is intended for the Kobo Reader."
|
msgid "This profile is intended for the Kobo Reader."
|
||||||
@ -609,11 +610,11 @@ msgstr "Este perfil é destinado para o Kindle DX da Amazon."
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686
|
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:686
|
||||||
msgid "This profile is intended for the B&N Nook Color."
|
msgid "This profile is intended for the B&N Nook Color."
|
||||||
msgstr ""
|
msgstr "Este perfil é destinado para a B & N Nook Color."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:697
|
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:697
|
||||||
msgid "This profile is intended for the Sanda Bambook."
|
msgid "This profile is intended for the Sanda Bambook."
|
||||||
msgstr ""
|
msgstr "Este perfil é destinado para o Sanda Bambook"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:34
|
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:34
|
||||||
msgid "Installed plugins"
|
msgid "Installed plugins"
|
||||||
@ -719,6 +720,9 @@ msgid ""
|
|||||||
"Cannot copy books directly from iDevice. Drag from iTunes Library to "
|
"Cannot copy books directly from iDevice. Drag from iTunes Library to "
|
||||||
"desktop, then add to calibre's Library window."
|
"desktop, then add to calibre's Library window."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Não é possível copiar livros diretamente do iDevice. Arraste a partir do "
|
||||||
|
"iTunes Library para o desktop, em seguida, adicione para a biblioteca "
|
||||||
|
"calibre."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:260
|
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:260
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:263
|
#: /home/kovid/work/calibre/src/calibre/devices/apple/driver.py:263
|
||||||
@ -812,7 +816,7 @@ msgstr "Comunica-se com o leitor Cybook Gen 3 / Opus."
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/cybook/driver.py:64
|
#: /home/kovid/work/calibre/src/calibre/devices/cybook/driver.py:64
|
||||||
msgid "Communicate with the Cybook Orizon eBook reader."
|
msgid "Communicate with the Cybook Orizon eBook reader."
|
||||||
msgstr ""
|
msgstr "Comunique-se com o leitor eBook Cybook Orizon."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:24
|
#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:24
|
||||||
msgid "Communicate with the EB600 eBook reader."
|
msgid "Communicate with the EB600 eBook reader."
|
||||||
@ -828,7 +832,7 @@ msgstr "Comunica-se com o leitor PocketBook 301"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:233
|
#: /home/kovid/work/calibre/src/calibre/devices/eb600/driver.py:233
|
||||||
msgid "Communicate with the PocketBook 602 reader."
|
msgid "Communicate with the PocketBook 602 reader."
|
||||||
msgstr ""
|
msgstr "Comunique-se com o leitor PocketBook 602."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17
|
#: /home/kovid/work/calibre/src/calibre/devices/edge/driver.py:17
|
||||||
msgid "Entourage Edge"
|
msgid "Entourage Edge"
|
||||||
@ -917,7 +921,7 @@ msgstr "John Schember"
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/interface.py:44
|
#: /home/kovid/work/calibre/src/calibre/devices/interface.py:44
|
||||||
msgid "Cannot get files from this device"
|
msgid "Cannot get files from this device"
|
||||||
msgstr ""
|
msgstr "Não é possível obter arquivos a partir deste dispositivo"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:16
|
#: /home/kovid/work/calibre/src/calibre/devices/irexdr/driver.py:16
|
||||||
msgid "Communicate with the IRex Digital Reader 1000 eBook reader."
|
msgid "Communicate with the IRex Digital Reader 1000 eBook reader."
|
||||||
@ -941,7 +945,7 @@ msgstr "Comunicar com o leitor MiBuk Wolder."
|
|||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:116
|
#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:116
|
||||||
msgid "Communicate with the JetBook Mini reader."
|
msgid "Communicate with the JetBook Mini reader."
|
||||||
msgstr ""
|
msgstr "Comunique-se com o leitor Mini jetBook."
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:43
|
#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:43
|
||||||
msgid "Communicate with the Kindle eBook reader."
|
msgid "Communicate with the Kindle eBook reader."
|
||||||
|
@ -8,13 +8,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre\n"
|
"Project-Id-Version: calibre\n"
|
||||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-12 15:48+0000\n"
|
"PO-Revision-Date: 2010-12-17 00:09+0000\n"
|
||||||
"Last-Translator: Mircea Dochia <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Romanian <ro@li.org>\n"
|
"Language-Team: Romanian <ro@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-13 04:58+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:44+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
||||||
|
@ -7,13 +7,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre 0.4.55\n"
|
"Project-Id-Version: calibre 0.4.55\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-14 16:19+0000\n"
|
"PO-Revision-Date: 2010-12-16 22:56+0000\n"
|
||||||
"Last-Translator: Konstantin <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: American English <kde-i18n-doc@lists.kde.org>\n"
|
"Language-Team: American English <kde-i18n-doc@lists.kde.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-15 04:36+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:44+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
"X-Poedit-Country: RUSSIAN FEDERATION\n"
|
"X-Poedit-Country: RUSSIAN FEDERATION\n"
|
||||||
"X-Poedit-Language: Russian\n"
|
"X-Poedit-Language: Russian\n"
|
||||||
|
@ -7,13 +7,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre 0.4.17\n"
|
"Project-Id-Version: calibre 0.4.17\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-14 10:17+0000\n"
|
"PO-Revision-Date: 2010-12-16 22:54+0000\n"
|
||||||
"Last-Translator: Stane Accetto <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: sl\n"
|
"Language-Team: sl\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-15 04:37+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:45+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
"Generated-By: pygettext.py 1.5\n"
|
"Generated-By: pygettext.py 1.5\n"
|
||||||
|
|
||||||
|
@ -8,13 +8,13 @@ msgstr ""
|
|||||||
"Project-Id-Version: calibre\n"
|
"Project-Id-Version: calibre\n"
|
||||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
"POT-Creation-Date: 2010-12-10 22:25+0000\n"
|
||||||
"PO-Revision-Date: 2010-12-13 11:44+0000\n"
|
"PO-Revision-Date: 2010-12-16 23:13+0000\n"
|
||||||
"Last-Translator: Vladimir Oka <Unknown>\n"
|
"Last-Translator: Kovid Goyal <Unknown>\n"
|
||||||
"Language-Team: Serbian <sr@li.org>\n"
|
"Language-Team: Serbian <sr@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2010-12-14 04:51+0000\n"
|
"X-Launchpad-Export-Date: 2010-12-17 04:45+0000\n"
|
||||||
"X-Generator: Launchpad (build Unknown)\n"
|
"X-Generator: Launchpad (build Unknown)\n"
|
||||||
|
|
||||||
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:43
|
||||||
|
@ -7,15 +7,19 @@ __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
|||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
import os, sys
|
import os, sys
|
||||||
from threading import Thread
|
|
||||||
|
|
||||||
from calibre.constants import plugins, iswindows
|
from calibre.constants import plugins, iswindows, islinux, isfreebsd
|
||||||
|
|
||||||
_fc, _fc_err = plugins['fontconfig']
|
_fc, _fc_err = plugins['fontconfig']
|
||||||
|
|
||||||
if _fc is None:
|
if _fc is None:
|
||||||
raise RuntimeError('Failed to load fontconfig with error:'+_fc_err)
|
raise RuntimeError('Failed to load fontconfig with error:'+_fc_err)
|
||||||
|
|
||||||
|
if islinux or isfreebsd:
|
||||||
|
Thread = object
|
||||||
|
else:
|
||||||
|
from threading import Thread
|
||||||
|
|
||||||
class FontConfig(Thread):
|
class FontConfig(Thread):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@ -45,6 +49,7 @@ class FontConfig(Thread):
|
|||||||
self.failed = True
|
self.failed = True
|
||||||
|
|
||||||
def wait(self):
|
def wait(self):
|
||||||
|
if not (islinux or isfreebsd):
|
||||||
self.join()
|
self.join()
|
||||||
if self.failed:
|
if self.failed:
|
||||||
raise RuntimeError('Failed to initialize fontconfig')
|
raise RuntimeError('Failed to initialize fontconfig')
|
||||||
@ -144,6 +149,12 @@ class FontConfig(Thread):
|
|||||||
return fonts if all else (fonts[0] if fonts else None)
|
return fonts if all else (fonts[0] if fonts else None)
|
||||||
|
|
||||||
fontconfig = FontConfig()
|
fontconfig = FontConfig()
|
||||||
|
if islinux or isfreebsd:
|
||||||
|
# On X11 Qt also uses fontconfig, so initialization must happen in the
|
||||||
|
# main thread. In any case on X11 initializing fontconfig should be very
|
||||||
|
# fast
|
||||||
|
fontconfig.run()
|
||||||
|
else:
|
||||||
fontconfig.start()
|
fontconfig.start()
|
||||||
|
|
||||||
def test():
|
def test():
|
||||||
|
@ -548,6 +548,7 @@ class BasicNewsRecipe(Recipe):
|
|||||||
}
|
}
|
||||||
|
|
||||||
For an example, see the recipe for downloading `The Atlantic`.
|
For an example, see the recipe for downloading `The Atlantic`.
|
||||||
|
In addition, you can add 'author' for the author of the article.
|
||||||
'''
|
'''
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|