Code

webslicer effects now extends a commom WebSlicer_Effect class
authorAurelio A. Heckert (a) <auriumgmaildotcom>
Mon, 29 Mar 2010 18:46:20 +0000 (15:46 -0300)
committerAurelio A. Heckert (a) <auriumgmaildotcom>
Mon, 29 Mar 2010 18:46:20 +0000 (15:46 -0300)
14 files changed:
po/inkscape.pot
share/extensions/webslicer-create-group.inx [deleted file]
share/extensions/webslicer-create-group.py [deleted file]
share/extensions/webslicer-create-rect.inx [deleted file]
share/extensions/webslicer-create-rect.py [deleted file]
share/extensions/webslicer-export.inx [deleted file]
share/extensions/webslicer-export.py [deleted file]
share/extensions/webslicer_create_group.inx [new file with mode: 0644]
share/extensions/webslicer_create_group.py [new file with mode: 0755]
share/extensions/webslicer_create_rect.inx [new file with mode: 0644]
share/extensions/webslicer_create_rect.py [new file with mode: 0755]
share/extensions/webslicer_effect.py [new file with mode: 0644]
share/extensions/webslicer_export.inx [new file with mode: 0644]
share/extensions/webslicer_export.py [new file with mode: 0755]

index 08da43e41539bd6d5efe7646bbca8dfbb717bb41..4f714fb4ef34ac0017a50df23a6772e321497097 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2010-03-18 20:17+0100\n"
+"POT-Creation-Date: 2010-03-29 12:15-0300\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -665,7 +665,7 @@ msgid "Shades"
 msgstr ""
 
 #: ../share/extensions/edge3d.inx.h:9 ../src/live_effects/lpe-knot.cpp:331
-#: ../src/widgets/stroke-style.cpp:1100
+#: ../src/widgets/stroke-style.cpp:691
 msgid "Stroke width"
 msgstr ""
 
@@ -808,7 +808,7 @@ msgstr ""
 
 #: ../share/extensions/foldablebox.inx.h:8
 #: ../share/extensions/interp_att_g.inx.h:24
-#: ../share/extensions/printing-marks.inx.h:19 ../src/helper/units.cpp:37
+#: ../share/extensions/printing-marks.inx.h:20 ../src/helper/units.cpp:37
 #: ../src/live_effects/lpe-ruler.cpp:44
 msgid "Unit"
 msgstr ""
@@ -1121,7 +1121,7 @@ msgstr ""
 #: ../src/ui/dialog/inkscape-preferences.cpp:578
 #: ../src/ui/dialog/inkscape-preferences.cpp:1208
 #: ../src/ui/dialog/inkscape-preferences.cpp:1273 ../src/verbs.cpp:2192
-#: ../src/widgets/stroke-style.cpp:772 ../src/widgets/toolbox.cpp:3991
+#: ../src/widgets/stroke-style.cpp:362 ../src/widgets/toolbox.cpp:3991
 msgid "None"
 msgstr ""
 
@@ -1310,7 +1310,7 @@ msgid "End Value"
 msgstr ""
 
 #: ../share/extensions/interp_att_g.inx.h:4
-#: ../src/ui/dialog/fill-and-stroke.cpp:48
+#: ../src/ui/dialog/fill-and-stroke.cpp:57
 msgid "Fill"
 msgstr ""
 
@@ -1358,7 +1358,7 @@ msgstr ""
 
 #: ../share/extensions/interp_att_g.inx.h:16
 #: ../share/extensions/render_alphabetsoup.inx.h:4
-#: ../src/live_effects/lpe-sketch.cpp:55 ../src/selection-chemistry.cpp:1650
+#: ../src/live_effects/lpe-sketch.cpp:55 ../src/selection-chemistry.cpp:1657
 #: ../src/seltrans.cpp:531 ../src/ui/dialog/transformation.cpp:738
 #: ../src/widgets/toolbox.cpp:4679
 msgid "Scale"
@@ -2119,14 +2119,22 @@ msgid "Right:"
 msgstr ""
 
 #: ../share/extensions/printing-marks.inx.h:16
-msgid "Set crop marks to"
+#: ../src/ui/dialog/align-and-distribute.cpp:927
+#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1414
+#: ../src/ui/dialog/icon-preview.cpp:178
+#: ../src/widgets/desktop-widget.cpp:1651
+msgid "Selection"
 msgstr ""
 
 #: ../share/extensions/printing-marks.inx.h:17
-msgid "Star Target"
+msgid "Set crop marks to"
 msgstr ""
 
 #: ../share/extensions/printing-marks.inx.h:18
+msgid "Star Target"
+msgstr ""
+
+#: ../share/extensions/printing-marks.inx.h:19
 msgid "Top:"
 msgstr ""
 
@@ -2808,7 +2816,7 @@ msgstr ""
 msgid "Create a slicer rectangle"
 msgstr ""
 
-#: ../share/extensions/webslicer-create-rect.inx.h:9 ../src/main.cpp:298
+#: ../share/extensions/webslicer-create-rect.inx.h:9 ../src/main.cpp:300
 #: ../src/ui/widget/rendering-options.cpp:43
 msgid "DPI"
 msgstr ""
@@ -5433,14 +5441,6 @@ msgstr ""
 msgid "Remove a connection point"
 msgstr ""
 
-#: ../src/connector-context.h:50
-msgid "<b>Connection point</b>: click or drag to create a new connector"
-msgstr ""
-
-#: ../src/connector-context.h:51
-msgid "<b>Connection point</b>: click to select, drag to move"
-msgstr ""
-
 #: ../src/live_effects/lpe-extrude.cpp:26
 msgid "Direction"
 msgstr ""
@@ -5514,43 +5514,51 @@ msgstr ""
 msgid "<b>3D Box</b>"
 msgstr ""
 
-#: ../src/connector-context.cpp:778
+#: ../src/connector-context.cpp:236
+msgid "<b>Connection point</b>: click or drag to create a new connector"
+msgstr ""
+
+#: ../src/connector-context.cpp:237
+msgid "<b>Connection point</b>: click to select, drag to move"
+msgstr ""
+
+#: ../src/connector-context.cpp:781
 msgid "Creating new connector"
 msgstr ""
 
-#: ../src/connector-context.cpp:1156
+#: ../src/connector-context.cpp:1159
 msgid "Connector endpoint drag cancelled."
 msgstr ""
 
-#: ../src/connector-context.cpp:1186
+#: ../src/connector-context.cpp:1189
 msgid "Connection point drag cancelled."
 msgstr ""
 
-#: ../src/connector-context.cpp:1304
+#: ../src/connector-context.cpp:1307
 msgid "Reroute connector"
 msgstr ""
 
-#: ../src/connector-context.cpp:1477
+#: ../src/connector-context.cpp:1480
 msgid "Create connector"
 msgstr ""
 
-#: ../src/connector-context.cpp:1500
+#: ../src/connector-context.cpp:1503
 msgid "Finishing connector"
 msgstr ""
 
-#: ../src/connector-context.cpp:1787
+#: ../src/connector-context.cpp:1790
 msgid "<b>Connector endpoint</b>: drag to reroute or connect to new shapes"
 msgstr ""
 
-#: ../src/connector-context.cpp:1928
+#: ../src/connector-context.cpp:1931
 msgid "Select <b>at least one non-connector object</b>."
 msgstr ""
 
-#: ../src/connector-context.cpp:1933 ../src/widgets/toolbox.cpp:7558
+#: ../src/connector-context.cpp:1936 ../src/widgets/toolbox.cpp:7558
 msgid "Make connectors avoid selected objects"
 msgstr ""
 
-#: ../src/connector-context.cpp:1934 ../src/widgets/toolbox.cpp:7568
+#: ../src/connector-context.cpp:1937 ../src/widgets/toolbox.cpp:7568
 msgid "Make connectors ignore selected objects"
 msgstr ""
 
@@ -5621,7 +5629,7 @@ msgstr ""
 msgid "Delete tiled clones"
 msgstr ""
 
-#: ../src/dialogs/clonetiler.cpp:1097 ../src/selection-chemistry.cpp:2016
+#: ../src/dialogs/clonetiler.cpp:1097 ../src/selection-chemistry.cpp:2023
 msgid "Select an <b>object</b> to clone."
 msgstr ""
 
@@ -7634,7 +7642,7 @@ msgid ""
 "this extension."
 msgstr ""
 
-#: ../src/extension/implementation/script.cpp:1053
+#: ../src/extension/implementation/script.cpp:979
 msgid ""
 "Inkscape has received additional data from the script executed.  The script "
 "did not return an error, but this may indicate the results will not be as "
@@ -8945,7 +8953,7 @@ msgstr ""
 msgid "Gamma"
 msgstr ""
 
-#: ../src/filter-enums.cpp:94 ../src/selection-chemistry.cpp:424
+#: ../src/filter-enums.cpp:94 ../src/selection-chemistry.cpp:425
 #: ../src/widgets/gradient-selector.cpp:141
 msgid "Duplicate"
 msgstr ""
@@ -9528,51 +9536,6 @@ msgid ""
 "The file already exists in \"%s\". Replacing it will overwrite its contents."
 msgstr ""
 
-#: ../src/io/sys.cpp:448 ../src/io/sys.cpp:456
-#, c-format
-msgid "Failed to read from child pipe (%s)"
-msgstr ""
-
-#: ../src/io/sys.cpp:480
-#, c-format
-msgid "Failed to change to directory '%s' (%s)"
-msgstr ""
-
-#: ../src/io/sys.cpp:486 ../src/io/sys.cpp:712
-#, c-format
-msgid "Failed to execute child process (%s)"
-msgstr ""
-
-#: ../src/io/sys.cpp:659
-#, c-format
-msgid "Invalid program name: %s"
-msgstr ""
-
-#: ../src/io/sys.cpp:669 ../src/io/sys.cpp:958
-#, c-format
-msgid "Invalid string in argument vector at %d: %s"
-msgstr ""
-
-#: ../src/io/sys.cpp:680 ../src/io/sys.cpp:973
-#, c-format
-msgid "Invalid string in environment: %s"
-msgstr ""
-
-#: ../src/io/sys.cpp:741
-#, c-format
-msgid "Failed to create pipe for communicating with child process (%s)"
-msgstr ""
-
-#: ../src/io/sys.cpp:954
-#, c-format
-msgid "Invalid working directory: %s"
-msgstr ""
-
-#: ../src/io/sys.cpp:1022
-#, c-format
-msgid "Failed to execute helper program (%s)"
-msgstr ""
-
 #: ../src/knot.cpp:431
 msgid "Node or handle drag canceled."
 msgstr ""
@@ -10951,224 +10914,224 @@ msgstr ""
 msgid "Unable to find node ID: '%s'\n"
 msgstr ""
 
-#: ../src/main.cpp:267
+#: ../src/main.cpp:269
 msgid "Print the Inkscape version number"
 msgstr ""
 
-#: ../src/main.cpp:272
+#: ../src/main.cpp:274
 msgid "Do not use X server (only process files from console)"
 msgstr ""
 
-#: ../src/main.cpp:277
+#: ../src/main.cpp:279
 msgid "Try to use X server (even if $DISPLAY is not set)"
 msgstr ""
 
-#: ../src/main.cpp:282
+#: ../src/main.cpp:284
 msgid "Open specified document(s) (option string may be excluded)"
 msgstr ""
 
-#: ../src/main.cpp:283 ../src/main.cpp:288 ../src/main.cpp:293
-#: ../src/main.cpp:360 ../src/main.cpp:365 ../src/main.cpp:370
-#: ../src/main.cpp:375 ../src/main.cpp:386
+#: ../src/main.cpp:285 ../src/main.cpp:290 ../src/main.cpp:295
+#: ../src/main.cpp:362 ../src/main.cpp:367 ../src/main.cpp:372
+#: ../src/main.cpp:377 ../src/main.cpp:388
 msgid "FILENAME"
 msgstr ""
 
-#: ../src/main.cpp:287
+#: ../src/main.cpp:289
 msgid "Print document(s) to specified output file (use '| program' for pipe)"
 msgstr ""
 
-#: ../src/main.cpp:292
+#: ../src/main.cpp:294
 msgid "Export document to a PNG file"
 msgstr ""
 
-#: ../src/main.cpp:297
+#: ../src/main.cpp:299
 msgid ""
 "Resolution for exporting to bitmap and for rasterization of filters in PS/"
 "EPS/PDF (default 90)"
 msgstr ""
 
-#: ../src/main.cpp:302
+#: ../src/main.cpp:304
 msgid ""
 "Exported area in SVG user units (default is the page; 0,0 is lower-left "
 "corner)"
 msgstr ""
 
-#: ../src/main.cpp:303
+#: ../src/main.cpp:305
 msgid "x0:y0:x1:y1"
 msgstr ""
 
-#: ../src/main.cpp:307
+#: ../src/main.cpp:309
 msgid "Exported area is the entire drawing (not page)"
 msgstr ""
 
-#: ../src/main.cpp:312
+#: ../src/main.cpp:314
 msgid "Exported area is the entire page"
 msgstr ""
 
-#: ../src/main.cpp:317
+#: ../src/main.cpp:319
 msgid ""
 "Snap the bitmap export area outwards to the nearest integer values (in SVG "
 "user units)"
 msgstr ""
 
-#: ../src/main.cpp:322
+#: ../src/main.cpp:324
 msgid "The width of exported bitmap in pixels (overrides export-dpi)"
 msgstr ""
 
-#: ../src/main.cpp:323
+#: ../src/main.cpp:325
 msgid "WIDTH"
 msgstr ""
 
-#: ../src/main.cpp:327
+#: ../src/main.cpp:329
 msgid "The height of exported bitmap in pixels (overrides export-dpi)"
 msgstr ""
 
-#: ../src/main.cpp:328
+#: ../src/main.cpp:330
 msgid "HEIGHT"
 msgstr ""
 
-#: ../src/main.cpp:332
+#: ../src/main.cpp:334
 msgid "The ID of the object to export"
 msgstr ""
 
-#: ../src/main.cpp:333 ../src/main.cpp:431
+#: ../src/main.cpp:335 ../src/main.cpp:433
 msgid "ID"
 msgstr ""
 
 #. TRANSLATORS: this means: "Only export the object whose id is given in --export-id".
 #. See "man inkscape" for details.
-#: ../src/main.cpp:339
+#: ../src/main.cpp:341
 msgid ""
 "Export just the object with export-id, hide all others (only with export-id)"
 msgstr ""
 
-#: ../src/main.cpp:344
+#: ../src/main.cpp:346
 msgid "Use stored filename and DPI hints when exporting (only with export-id)"
 msgstr ""
 
-#: ../src/main.cpp:349
+#: ../src/main.cpp:351
 msgid "Background color of exported bitmap (any SVG-supported color string)"
 msgstr ""
 
-#: ../src/main.cpp:350
+#: ../src/main.cpp:352
 msgid "COLOR"
 msgstr ""
 
-#: ../src/main.cpp:354
+#: ../src/main.cpp:356
 msgid "Background opacity of exported bitmap (either 0.0 to 1.0, or 1 to 255)"
 msgstr ""
 
-#: ../src/main.cpp:355
+#: ../src/main.cpp:357
 msgid "VALUE"
 msgstr ""
 
-#: ../src/main.cpp:359
+#: ../src/main.cpp:361
 msgid "Export document to plain SVG file (no sodipodi or inkscape namespaces)"
 msgstr ""
 
-#: ../src/main.cpp:364
+#: ../src/main.cpp:366
 msgid "Export document to a PS file"
 msgstr ""
 
-#: ../src/main.cpp:369
+#: ../src/main.cpp:371
 msgid "Export document to an EPS file"
 msgstr ""
 
-#: ../src/main.cpp:374
+#: ../src/main.cpp:376
 msgid "Export document to a PDF file"
 msgstr ""
 
-#: ../src/main.cpp:379
+#: ../src/main.cpp:381
 msgid ""
 "Export PDF/PS/EPS without text. Besides the PDF/PS/EPS, a LaTeX file is "
 "exported, putting the text on top of the PDF/PS/EPS file. Include the result "
 "in LaTeX like: \\input{latexfile.tex}"
 msgstr ""
 
-#: ../src/main.cpp:385
+#: ../src/main.cpp:387
 msgid "Export document to an Enhanced Metafile (EMF) File"
 msgstr ""
 
-#: ../src/main.cpp:391
+#: ../src/main.cpp:393
 msgid "Convert text object to paths on export (PS, EPS, PDF)"
 msgstr ""
 
-#: ../src/main.cpp:396
+#: ../src/main.cpp:398
 msgid ""
 "Render filtered objects without filters, instead of rasterizing (PS, EPS, "
 "PDF)"
 msgstr ""
 
 #. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help"
-#: ../src/main.cpp:402
+#: ../src/main.cpp:404
 msgid ""
 "Query the X coordinate of the drawing or, if specified, of the object with --"
 "query-id"
 msgstr ""
 
 #. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help"
-#: ../src/main.cpp:408
+#: ../src/main.cpp:410
 msgid ""
 "Query the Y coordinate of the drawing or, if specified, of the object with --"
 "query-id"
 msgstr ""
 
 #. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help"
-#: ../src/main.cpp:414
+#: ../src/main.cpp:416
 msgid ""
 "Query the width of the drawing or, if specified, of the object with --query-"
 "id"
 msgstr ""
 
 #. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help"
-#: ../src/main.cpp:420
+#: ../src/main.cpp:422
 msgid ""
 "Query the height of the drawing or, if specified, of the object with --query-"
 "id"
 msgstr ""
 
-#: ../src/main.cpp:425
+#: ../src/main.cpp:427
 msgid "List id,x,y,w,h for all objects"
 msgstr ""
 
-#: ../src/main.cpp:430
+#: ../src/main.cpp:432
 msgid "The ID of the object whose dimensions are queried"
 msgstr ""
 
 #. TRANSLATORS: this option makes Inkscape print the name (path) of the extension directory
-#: ../src/main.cpp:436
+#: ../src/main.cpp:438
 msgid "Print out the extension directory and exit"
 msgstr ""
 
-#: ../src/main.cpp:441
+#: ../src/main.cpp:443
 msgid "Remove unused definitions from the defs section(s) of the document"
 msgstr ""
 
-#: ../src/main.cpp:446
+#: ../src/main.cpp:448
 msgid "List the IDs of all the verbs in Inkscape"
 msgstr ""
 
-#: ../src/main.cpp:451
+#: ../src/main.cpp:453
 msgid "Verb to call when Inkscape opens."
 msgstr ""
 
-#: ../src/main.cpp:452
+#: ../src/main.cpp:454
 msgid "VERB-ID"
 msgstr ""
 
-#: ../src/main.cpp:456
+#: ../src/main.cpp:458
 msgid "Object ID to select when Inkscape opens."
 msgstr ""
 
-#: ../src/main.cpp:457
+#: ../src/main.cpp:459
 msgid "OBJECT-ID"
 msgstr ""
 
-#: ../src/main.cpp:461
+#: ../src/main.cpp:463
 msgid "Start Inkscape in interactive shell mode."
 msgstr ""
 
-#: ../src/main.cpp:774 ../src/main.cpp:1100
+#: ../src/main.cpp:797 ../src/main.cpp:1123
 msgid ""
 "[OPTIONS...] [FILE...]\n"
 "\n"
@@ -11853,25 +11816,25 @@ msgstr ""
 msgid "Selected object is not a group. Cannot enter."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:303
+#: ../src/selection-chemistry.cpp:304
 msgid "Delete text"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:311
+#: ../src/selection-chemistry.cpp:312
 msgid "<b>Nothing</b> was deleted."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:329 ../src/text-context.cpp:1002
+#: ../src/selection-chemistry.cpp:330 ../src/text-context.cpp:1002
 #: ../src/ui/dialog/swatches.cpp:220 ../src/widgets/toolbox.cpp:1318
 #: ../src/widgets/toolbox.cpp:6076
 msgid "Delete"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:357
+#: ../src/selection-chemistry.cpp:358
 msgid "Select <b>object(s)</b> to duplicate."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:449
+#: ../src/selection-chemistry.cpp:450
 msgid "Delete all"
 msgstr ""
 
@@ -11879,28 +11842,28 @@ msgstr ""
 msgid "Select <b>some objects</b> to group."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:648 ../src/selection-describer.cpp:53
+#: ../src/selection-chemistry.cpp:651 ../src/selection-describer.cpp:53
 msgid "Group"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:663
+#: ../src/selection-chemistry.cpp:665
 msgid "Select a <b>group</b> to ungroup."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:704
+#: ../src/selection-chemistry.cpp:706
 msgid "<b>No groups</b> to ungroup in the selection."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:710 ../src/sp-item-group.cpp:500
+#: ../src/selection-chemistry.cpp:712 ../src/sp-item-group.cpp:500
 msgid "Ungroup"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:800
+#: ../src/selection-chemistry.cpp:802
 msgid "Select <b>object(s)</b> to raise."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:806 ../src/selection-chemistry.cpp:868
-#: ../src/selection-chemistry.cpp:902 ../src/selection-chemistry.cpp:966
+#: ../src/selection-chemistry.cpp:808 ../src/selection-chemistry.cpp:870
+#: ../src/selection-chemistry.cpp:904 ../src/selection-chemistry.cpp:968
 msgid ""
 "You cannot raise/lower objects from <b>different groups</b> or <b>layers</b>."
 msgstr ""
@@ -11908,294 +11871,294 @@ msgstr ""
 #. TRANSLATORS: only translate "string" in "context|string".
 #. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
 #. "Raise" means "to raise an object" in the undo history
-#: ../src/selection-chemistry.cpp:848
+#: ../src/selection-chemistry.cpp:850
 msgid "undo action|Raise"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:860
+#: ../src/selection-chemistry.cpp:862
 msgid "Select <b>object(s)</b> to raise to top."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:883
+#: ../src/selection-chemistry.cpp:885
 msgid "Raise to top"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:896
+#: ../src/selection-chemistry.cpp:898
 msgid "Select <b>object(s)</b> to lower."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:946
+#: ../src/selection-chemistry.cpp:948
 msgid "Lower"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:958
+#: ../src/selection-chemistry.cpp:960
 msgid "Select <b>object(s)</b> to lower to bottom."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:993
+#: ../src/selection-chemistry.cpp:995
 msgid "Lower to bottom"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1000
+#: ../src/selection-chemistry.cpp:1002
 msgid "Nothing to undo."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1007
+#: ../src/selection-chemistry.cpp:1009
 msgid "Nothing to redo."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1067
+#: ../src/selection-chemistry.cpp:1069
 msgid "Paste"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1074
+#: ../src/selection-chemistry.cpp:1077
 msgid "Paste style"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1083
+#: ../src/selection-chemistry.cpp:1087
 msgid "Paste live path effect"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1103
+#: ../src/selection-chemistry.cpp:1108
 msgid "Select <b>object(s)</b> to remove live path effects from."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1115
+#: ../src/selection-chemistry.cpp:1120
 msgid "Remove live path effect"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1126
+#: ../src/selection-chemistry.cpp:1131
 msgid "Select <b>object(s)</b> to remove filters from."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1136
+#: ../src/selection-chemistry.cpp:1141
 #: ../src/ui/dialog/filter-effects-dialog.cpp:1336
 msgid "Remove filter"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1145
+#: ../src/selection-chemistry.cpp:1150
 msgid "Paste size"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1153
+#: ../src/selection-chemistry.cpp:1159
 msgid "Paste size separately"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1162
+#: ../src/selection-chemistry.cpp:1169
 msgid "Select <b>object(s)</b> to move to the layer above."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1188
+#: ../src/selection-chemistry.cpp:1195
 msgid "Raise to next layer"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1195
+#: ../src/selection-chemistry.cpp:1202
 msgid "No more layers above."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1207
+#: ../src/selection-chemistry.cpp:1214
 msgid "Select <b>object(s)</b> to move to the layer below."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1233
+#: ../src/selection-chemistry.cpp:1240
 msgid "Lower to previous layer"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1240
+#: ../src/selection-chemistry.cpp:1247
 msgid "No more layers below."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1449
+#: ../src/selection-chemistry.cpp:1456
 msgid "Remove transform"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1552
+#: ../src/selection-chemistry.cpp:1559
 msgid "Rotate 90&#176; CCW"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1552
+#: ../src/selection-chemistry.cpp:1559
 msgid "Rotate 90&#176; CW"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1573 ../src/seltrans.cpp:534
+#: ../src/selection-chemistry.cpp:1580 ../src/seltrans.cpp:534
 #: ../src/ui/dialog/transformation.cpp:760
 msgid "Rotate"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1620
+#: ../src/selection-chemistry.cpp:1627
 msgid "Rotate by pixels"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1675
+#: ../src/selection-chemistry.cpp:1682
 msgid "Scale by whole factor"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1690
+#: ../src/selection-chemistry.cpp:1697
 msgid "Move vertically"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1693
+#: ../src/selection-chemistry.cpp:1700
 msgid "Move horizontally"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1696 ../src/selection-chemistry.cpp:1722
+#: ../src/selection-chemistry.cpp:1703 ../src/selection-chemistry.cpp:1729
 #: ../src/seltrans.cpp:528 ../src/ui/dialog/transformation.cpp:681
 msgid "Move"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1716
+#: ../src/selection-chemistry.cpp:1723
 msgid "Move vertically by pixels"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1719
+#: ../src/selection-chemistry.cpp:1726
 msgid "Move horizontally by pixels"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:1847
+#: ../src/selection-chemistry.cpp:1854
 msgid "The selection has no applied path effect."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2052
+#: ../src/selection-chemistry.cpp:2059
 msgid "action|Clone"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2068
+#: ../src/selection-chemistry.cpp:2075
 msgid "Select <b>clones</b> to relink."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2075
+#: ../src/selection-chemistry.cpp:2082
 msgid "Copy an <b>object</b> to clipboard to relink clones to."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2099
+#: ../src/selection-chemistry.cpp:2106
 msgid "<b>No clones to relink</b> in the selection."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2102
+#: ../src/selection-chemistry.cpp:2109
 msgid "Relink clone"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2116
+#: ../src/selection-chemistry.cpp:2123
 msgid "Select <b>clones</b> to unlink."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2165
+#: ../src/selection-chemistry.cpp:2172
 msgid "<b>No clones to unlink</b> in the selection."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2169
+#: ../src/selection-chemistry.cpp:2176
 msgid "Unlink clone"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2182
+#: ../src/selection-chemistry.cpp:2189
 msgid ""
 "Select a <b>clone</b> to go to its original. Select a <b>linked offset</b> "
 "to go to its source. Select a <b>text on path</b> to go to the path. Select "
 "a <b>flowed text</b> to go to its frame."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2205
+#: ../src/selection-chemistry.cpp:2212
 msgid ""
 "<b>Cannot find</b> the object to select (orphaned clone, offset, textpath, "
 "flowed text?)"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2211
+#: ../src/selection-chemistry.cpp:2218
 msgid ""
 "The object you're trying to select is <b>not visible</b> (it is in &lt;"
 "defs&gt;)"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2257
+#: ../src/selection-chemistry.cpp:2264
 msgid "Select <b>object(s)</b> to convert to marker."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2325
+#: ../src/selection-chemistry.cpp:2332
 msgid "Objects to marker"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2353
+#: ../src/selection-chemistry.cpp:2360
 msgid "Select <b>object(s)</b> to convert to guides."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2365
+#: ../src/selection-chemistry.cpp:2372
 msgid "Objects to guides"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2381
+#: ../src/selection-chemistry.cpp:2388
 msgid "Select <b>object(s)</b> to convert to pattern."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2469
+#: ../src/selection-chemistry.cpp:2476
 msgid "Objects to pattern"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2485
+#: ../src/selection-chemistry.cpp:2492
 msgid "Select an <b>object with pattern fill</b> to extract objects from."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2538
+#: ../src/selection-chemistry.cpp:2545
 msgid "<b>No pattern fills</b> in the selection."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2541
+#: ../src/selection-chemistry.cpp:2548
 msgid "Pattern to objects"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2626
+#: ../src/selection-chemistry.cpp:2633
 msgid "Select <b>object(s)</b> to make a bitmap copy."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2630
+#: ../src/selection-chemistry.cpp:2637
 msgid "Rendering bitmap..."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2804
+#: ../src/selection-chemistry.cpp:2811
 msgid "Create bitmap"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2836
+#: ../src/selection-chemistry.cpp:2843
 msgid "Select <b>object(s)</b> to create clippath or mask from."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:2839
+#: ../src/selection-chemistry.cpp:2846
 msgid "Select mask object and <b>object(s)</b> to apply clippath or mask to."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:3004
+#: ../src/selection-chemistry.cpp:3027
 msgid "Set clipping path"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:3006
+#: ../src/selection-chemistry.cpp:3029
 msgid "Set mask"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:3019
+#: ../src/selection-chemistry.cpp:3042
 msgid "Select <b>object(s)</b> to remove clippath or mask from."
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:3119
+#: ../src/selection-chemistry.cpp:3153
 msgid "Release clipping path"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:3121
+#: ../src/selection-chemistry.cpp:3155
 msgid "Release mask"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:3139
+#: ../src/selection-chemistry.cpp:3173
 msgid "Select <b>object(s)</b> to fit canvas to."
 msgstr ""
 
 #. Fit Page
-#: ../src/selection-chemistry.cpp:3159 ../src/verbs.cpp:2688
+#: ../src/selection-chemistry.cpp:3193 ../src/verbs.cpp:2688
 msgid "Fit Page to Selection"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:3188 ../src/verbs.cpp:2690
+#: ../src/selection-chemistry.cpp:3222 ../src/verbs.cpp:2690
 msgid "Fit Page to Drawing"
 msgstr ""
 
-#: ../src/selection-chemistry.cpp:3209 ../src/verbs.cpp:2692
+#: ../src/selection-chemistry.cpp:3243 ../src/verbs.cpp:2692
 msgid "Fit Page to Selection or Drawing"
 msgstr ""
 
@@ -13339,41 +13302,41 @@ msgid "Blur tweak"
 msgstr ""
 
 #. check whether something is selected
-#: ../src/ui/clipboard.cpp:257
+#: ../src/ui/clipboard.cpp:261
 msgid "Nothing was copied."
 msgstr ""
 
-#: ../src/ui/clipboard.cpp:318 ../src/ui/clipboard.cpp:521
-#: ../src/ui/clipboard.cpp:545
+#: ../src/ui/clipboard.cpp:333 ../src/ui/clipboard.cpp:544
+#: ../src/ui/clipboard.cpp:568
 msgid "Nothing on the clipboard."
 msgstr ""
 
-#: ../src/ui/clipboard.cpp:374
+#: ../src/ui/clipboard.cpp:392
 msgid "Select <b>object(s)</b> to paste style to."
 msgstr ""
 
-#: ../src/ui/clipboard.cpp:385 ../src/ui/clipboard.cpp:403
+#: ../src/ui/clipboard.cpp:403 ../src/ui/clipboard.cpp:421
 msgid "No style on the clipboard."
 msgstr ""
 
-#: ../src/ui/clipboard.cpp:425
+#: ../src/ui/clipboard.cpp:446
 msgid "Select <b>object(s)</b> to paste size to."
 msgstr ""
 
-#: ../src/ui/clipboard.cpp:432
+#: ../src/ui/clipboard.cpp:453
 msgid "No size on the clipboard."
 msgstr ""
 
-#: ../src/ui/clipboard.cpp:483
+#: ../src/ui/clipboard.cpp:506
 msgid "Select <b>object(s)</b> to paste live path effect to."
 msgstr ""
 
 #. no_effect:
-#: ../src/ui/clipboard.cpp:508
+#: ../src/ui/clipboard.cpp:531
 msgid "No effect on the clipboard."
 msgstr ""
 
-#: ../src/ui/clipboard.cpp:528 ../src/ui/clipboard.cpp:555
+#: ../src/ui/clipboard.cpp:551 ../src/ui/clipboard.cpp:579
 msgid "Clipboard does not contain a path."
 msgstr ""
 
@@ -13708,13 +13671,6 @@ msgstr ""
 msgid "Smallest object"
 msgstr ""
 
-#: ../src/ui/dialog/align-and-distribute.cpp:927
-#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1414
-#: ../src/ui/dialog/icon-preview.cpp:178
-#: ../src/widgets/desktop-widget.cpp:1651
-msgid "Selection"
-msgstr ""
-
 #: ../src/ui/dialog/calligraphic-profile-rename.cpp:38
 msgid "Profile name:"
 msgstr ""
@@ -14205,11 +14161,11 @@ msgstr ""
 msgid "No file selected"
 msgstr ""
 
-#: ../src/ui/dialog/fill-and-stroke.cpp:49
+#: ../src/ui/dialog/fill-and-stroke.cpp:58
 msgid "Stroke _paint"
 msgstr ""
 
-#: ../src/ui/dialog/fill-and-stroke.cpp:50
+#: ../src/ui/dialog/fill-and-stroke.cpp:59
 msgid "Stroke st_yle"
 msgstr ""
 
@@ -18278,13 +18234,13 @@ msgid "No stroke"
 msgstr ""
 
 #: ../src/ui/widget/selected-style.cpp:166
-#: ../src/ui/widget/style-swatch.cpp:277 ../src/widgets/paint-selector.cpp:227
+#: ../src/ui/widget/style-swatch.cpp:277 ../src/widgets/paint-selector.cpp:239
 msgid "Pattern"
 msgstr ""
 
 #: ../src/ui/widget/selected-style.cpp:169
 #: ../src/ui/widget/style-swatch.cpp:279
-#: ../src/widgets/paint-selector.cpp:1052
+#: ../src/widgets/paint-selector.cpp:1027
 msgid "Pattern fill"
 msgstr ""
 
@@ -18342,14 +18298,14 @@ msgstr ""
 #: ../src/ui/widget/selected-style.cpp:199
 #: ../src/ui/widget/selected-style.cpp:257
 #: ../src/ui/widget/selected-style.cpp:499
-#: ../src/ui/widget/style-swatch.cpp:303 ../src/widgets/fill-style.cpp:532
+#: ../src/ui/widget/style-swatch.cpp:303 ../src/widgets/fill-style.cpp:636
 msgid "Unset fill"
 msgstr ""
 
 #: ../src/ui/widget/selected-style.cpp:199
 #: ../src/ui/widget/selected-style.cpp:257
 #: ../src/ui/widget/selected-style.cpp:515
-#: ../src/ui/widget/style-swatch.cpp:303 ../src/widgets/stroke-style.cpp:469
+#: ../src/ui/widget/style-swatch.cpp:303 ../src/widgets/fill-style.cpp:636
 msgid "Unset stroke"
 msgstr ""
 
@@ -18431,12 +18387,12 @@ msgid "Make stroke opaque"
 msgstr ""
 
 #: ../src/ui/widget/selected-style.cpp:261
-#: ../src/ui/widget/selected-style.cpp:481 ../src/widgets/fill-style.cpp:388
+#: ../src/ui/widget/selected-style.cpp:481 ../src/widgets/fill-style.cpp:446
 msgid "Remove fill"
 msgstr ""
 
 #: ../src/ui/widget/selected-style.cpp:261
-#: ../src/ui/widget/selected-style.cpp:490 ../src/widgets/stroke-style.cpp:339
+#: ../src/ui/widget/selected-style.cpp:490 ../src/widgets/fill-style.cpp:446
 msgid "Remove stroke"
 msgstr ""
 
@@ -20597,22 +20553,34 @@ msgstr ""
 msgid "remove"
 msgstr ""
 
-#: ../src/widgets/fill-style.cpp:286
+#: ../src/widgets/fill-style.cpp:327
 msgid "Change fill rule"
 msgstr ""
 
-#: ../src/widgets/fill-style.cpp:326 ../src/widgets/fill-style.cpp:400
+#: ../src/widgets/fill-style.cpp:380 ../src/widgets/fill-style.cpp:462
 msgid "Set fill color"
 msgstr ""
 
-#: ../src/widgets/fill-style.cpp:470
+#: ../src/widgets/fill-style.cpp:380 ../src/widgets/fill-style.cpp:462
+msgid "Set stroke color"
+msgstr ""
+
+#: ../src/widgets/fill-style.cpp:549
 msgid "Set gradient on fill"
 msgstr ""
 
-#: ../src/widgets/fill-style.cpp:517
+#: ../src/widgets/fill-style.cpp:549
+msgid "Set gradient on stroke"
+msgstr ""
+
+#: ../src/widgets/fill-style.cpp:609
 msgid "Set pattern on fill"
 msgstr ""
 
+#: ../src/widgets/fill-style.cpp:610
+msgid "Set pattern on stroke"
+msgstr ""
+
 #. Family frame
 #: ../src/widgets/font-selector.cpp:157
 msgid "Font family"
@@ -20721,7 +20689,7 @@ msgid "<b>Change:</b>"
 msgstr ""
 
 #: ../src/widgets/gradient-vector.cpp:267
-#: ../src/widgets/paint-selector.cpp:940 ../src/widgets/stroke-style.cpp:827
+#: ../src/widgets/paint-selector.cpp:914 ../src/widgets/stroke-style.cpp:417
 msgid "No document selected"
 msgstr ""
 
@@ -20771,64 +20739,64 @@ msgstr ""
 msgid "Change gradient stop color"
 msgstr ""
 
-#: ../src/widgets/paint-selector.cpp:219 ../src/widgets/paint-selector.cpp:617
+#: ../src/widgets/paint-selector.cpp:231 ../src/widgets/paint-selector.cpp:614
 msgid "No paint"
 msgstr ""
 
-#: ../src/widgets/paint-selector.cpp:221 ../src/widgets/paint-selector.cpp:689
+#: ../src/widgets/paint-selector.cpp:233 ../src/widgets/paint-selector.cpp:678
 msgid "Flat color"
 msgstr ""
 
 #. sp_gradient_selector_set_mode(SP_GRADIENT_SELECTOR(gsel), SP_GRADIENT_SELECTOR_MODE_LINEAR);
-#: ../src/widgets/paint-selector.cpp:223 ../src/widgets/paint-selector.cpp:761
+#: ../src/widgets/paint-selector.cpp:235 ../src/widgets/paint-selector.cpp:741
 msgid "Linear gradient"
 msgstr ""
 
-#: ../src/widgets/paint-selector.cpp:225 ../src/widgets/paint-selector.cpp:764
+#: ../src/widgets/paint-selector.cpp:237 ../src/widgets/paint-selector.cpp:744
 msgid "Radial gradient"
 msgstr ""
 
-#: ../src/widgets/paint-selector.cpp:229
+#: ../src/widgets/paint-selector.cpp:241
 msgid "Swatch"
 msgstr ""
 
-#: ../src/widgets/paint-selector.cpp:231
+#: ../src/widgets/paint-selector.cpp:243
 msgid "Unset paint (make it undefined so it can be inherited)"
 msgstr ""
 
 #. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty
-#: ../src/widgets/paint-selector.cpp:243
+#: ../src/widgets/paint-selector.cpp:255
 msgid ""
 "Any path self-intersections or subpaths create holes in the fill (fill-rule: "
 "evenodd)"
 msgstr ""
 
 #. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty
-#: ../src/widgets/paint-selector.cpp:254
+#: ../src/widgets/paint-selector.cpp:266
 msgid ""
 "Fill is solid unless a subpath is counterdirectional (fill-rule: nonzero)"
 msgstr ""
 
-#: ../src/widgets/paint-selector.cpp:584
+#: ../src/widgets/paint-selector.cpp:581
 msgid "No objects"
 msgstr ""
 
-#: ../src/widgets/paint-selector.cpp:595
+#: ../src/widgets/paint-selector.cpp:592
 msgid "Multiple styles"
 msgstr ""
 
-#: ../src/widgets/paint-selector.cpp:606
+#: ../src/widgets/paint-selector.cpp:603
 msgid "Paint is undefined"
 msgstr ""
 
-#: ../src/widgets/paint-selector.cpp:1039
+#: ../src/widgets/paint-selector.cpp:1014
 msgid ""
 "Use the <b>Node tool</b> to adjust position, scale, and rotation of the "
 "pattern on canvas. Use <b>Object &gt; Pattern &gt; Objects to Pattern</b> to "
 "create a new pattern from selection."
 msgstr ""
 
-#: ../src/widgets/paint-selector.cpp:1125
+#: ../src/widgets/paint-selector.cpp:1103
 msgid "Swatch fill"
 msgstr ""
 
@@ -21114,54 +21082,42 @@ msgstr ""
 msgid "Type text in a text node"
 msgstr ""
 
-#: ../src/widgets/stroke-style.cpp:289 ../src/widgets/stroke-style.cpp:348
-msgid "Set stroke color"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:400
-msgid "Set gradient on stroke"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:444
-msgid "Set pattern on stroke"
-msgstr ""
-
-#: ../src/widgets/stroke-style.cpp:911
+#: ../src/widgets/stroke-style.cpp:502
 msgid "Set markers"
 msgstr ""
 
 #. TRANSLATORS: only translate "string" in "context|string".
 #. For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS
 #. Stroke width
-#: ../src/widgets/stroke-style.cpp:1086
+#: ../src/widgets/stroke-style.cpp:677
 msgid "StrokeWidth|Width:"
 msgstr ""
 
 #. Join type
 #. TRANSLATORS: The line join style specifies the shape to be used at the
 #. corners of paths. It can be "miter", "round" or "bevel".
-#: ../src/widgets/stroke-style.cpp:1124
+#: ../src/widgets/stroke-style.cpp:715
 msgid "Join:"
 msgstr ""
 
 #. TRANSLATORS: Miter join: joining lines with a sharp (pointed) corner.
 #. For an example, draw a triangle with a large stroke width and modify the
 #. "Join" option (in the Fill and Stroke dialog).
-#: ../src/widgets/stroke-style.cpp:1136
+#: ../src/widgets/stroke-style.cpp:727
 msgid "Miter join"
 msgstr ""
 
 #. TRANSLATORS: Round join: joining lines with a rounded corner.
 #. For an example, draw a triangle with a large stroke width and modify the
 #. "Join" option (in the Fill and Stroke dialog).
-#: ../src/widgets/stroke-style.cpp:1146
+#: ../src/widgets/stroke-style.cpp:737
 msgid "Round join"
 msgstr ""
 
 #. TRANSLATORS: Bevel join: joining lines with a blunted (flattened) corner.
 #. For an example, draw a triangle with a large stroke width and modify the
 #. "Join" option (in the Fill and Stroke dialog).
-#: ../src/widgets/stroke-style.cpp:1156
+#: ../src/widgets/stroke-style.cpp:747
 msgid "Bevel join"
 msgstr ""
 
@@ -21172,72 +21128,72 @@ msgstr ""
 #. spike that extends well beyond the connection point. The purpose of the
 #. miter limit is to cut off such spikes (i.e. convert them into bevels)
 #. when they become too long.
-#: ../src/widgets/stroke-style.cpp:1168
+#: ../src/widgets/stroke-style.cpp:759
 msgid "Miter limit:"
 msgstr ""
 
-#: ../src/widgets/stroke-style.cpp:1176
+#: ../src/widgets/stroke-style.cpp:767
 msgid "Maximum length of the miter (in units of stroke width)"
 msgstr ""
 
 #. Cap type
 #. TRANSLATORS: cap type specifies the shape for the ends of lines
-#: ../src/widgets/stroke-style.cpp:1188
+#: ../src/widgets/stroke-style.cpp:779
 msgid "Cap:"
 msgstr ""
 
 #. TRANSLATORS: Butt cap: the line shape does not extend beyond the end point
 #. of the line; the ends of the line are square
-#: ../src/widgets/stroke-style.cpp:1200
+#: ../src/widgets/stroke-style.cpp:791
 msgid "Butt cap"
 msgstr ""
 
 #. TRANSLATORS: Round cap: the line shape extends beyond the end point of the
 #. line; the ends of the line are rounded
-#: ../src/widgets/stroke-style.cpp:1208
+#: ../src/widgets/stroke-style.cpp:799
 msgid "Round cap"
 msgstr ""
 
 #. TRANSLATORS: Square cap: the line shape extends beyond the end point of the
 #. line; the ends of the line are square
-#: ../src/widgets/stroke-style.cpp:1216
+#: ../src/widgets/stroke-style.cpp:807
 msgid "Square cap"
 msgstr ""
 
 #. Dash
-#: ../src/widgets/stroke-style.cpp:1222
+#: ../src/widgets/stroke-style.cpp:813
 msgid "Dashes:"
 msgstr ""
 
 #. TRANSLATORS: Path markers are an SVG feature that allows you to attach arbitrary shapes
 #. (arrowheads, bullets, faces, whatever) to the start, end, or middle nodes of a path.
-#: ../src/widgets/stroke-style.cpp:1239
+#: ../src/widgets/stroke-style.cpp:830
 msgid "Start Markers:"
 msgstr ""
 
-#: ../src/widgets/stroke-style.cpp:1241
+#: ../src/widgets/stroke-style.cpp:832
 msgid "Start Markers are drawn on the first node of a path or shape"
 msgstr ""
 
-#: ../src/widgets/stroke-style.cpp:1250
+#: ../src/widgets/stroke-style.cpp:841
 msgid "Mid Markers:"
 msgstr ""
 
-#: ../src/widgets/stroke-style.cpp:1252
+#: ../src/widgets/stroke-style.cpp:843
 msgid ""
 "Mid Markers are drawn on every node of a path or shape except the first and "
 "last nodes"
 msgstr ""
 
-#: ../src/widgets/stroke-style.cpp:1261
+#: ../src/widgets/stroke-style.cpp:852
 msgid "End Markers:"
 msgstr ""
 
-#: ../src/widgets/stroke-style.cpp:1263
+#: ../src/widgets/stroke-style.cpp:854
 msgid "End Markers are drawn on the last node of a path or shape"
 msgstr ""
 
-#: ../src/widgets/stroke-style.cpp:1612 ../src/widgets/stroke-style.cpp:1708
+#: ../src/widgets/stroke-style.cpp:1207 ../src/widgets/stroke-style.cpp:1304
 msgid "Set stroke style"
 msgstr ""
 
diff --git a/share/extensions/webslicer-create-group.inx b/share/extensions/webslicer-create-group.inx
deleted file mode 100644 (file)
index b5c5b48..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
-  <_name>Set a layout group</_name>
-  <id>org.inkscape.web.slicer.create-group</id>
-  <dependency type="executable" location="extensions">webslicer-create-group.py</dependency>
-  <dependency type="executable" location="extensions">inkex.py</dependency>
-  <_param name="about" type="description">Layout Group is only about to help a better code generation (if you need it). To use this, first you must to select some "Slicer rectangles".</_param>
-  <param name="html-id" type="string" _gui-text="HTML id atribute"></param>
-  <param name="html-class" type="string" _gui-text="HTML class atribute"></param>
-  <param name="width-unity" type="enum" _gui-text="Width Unity">
-    <_item value="px">Pixel (fixed)</_item>
-    <_item value="percent">Percent (relative to parent size)</_item>
-    <_item value="undefined">Undefined (relative to non-floating content size)</_item>
-  </param>
-  <param name="height-unity" type="enum" _gui-text="Height Unity">
-    <_item value="px">Pixel (fixed)</_item>
-    <_item value="percent">Percent (relative to parent size)</_item>
-    <_item value="undefined">Undefined (relative to non-floating content size)</_item>
-  </param>
-  <effect needs-live-preview="false">
-    <object-type>all</object-type>
-    <effects-menu>
-      <submenu _name="Web">
-        <submenu name="Slicer"/>
-      </submenu>
-    </effects-menu>
-  </effect>
-  <script>
-    <command reldir="extensions" interpreter="python">webslicer-create-group.py</command>
-  </script>
-</inkscape-extension>
diff --git a/share/extensions/webslicer-create-group.py b/share/extensions/webslicer-create-group.py
deleted file mode 100755 (executable)
index aadfded..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/usr/bin/env python
-'''
-Copyright (C) 2010 Aurelio A. Heckert, aurium (a) gmail dot com
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-'''
-
-import inkex
-import gettext
-
-_ = gettext.gettext
-
-def is_empty(val):
-    if val is None:
-        return True
-    else:
-        return len(str(val)) == 0
-
-class WebSlicer_CreateGroup(inkex.Effect):
-
-    def __init__(self):
-        inkex.Effect.__init__(self)
-        self.OptionParser.add_option("--html-id",
-                                     action="store", type="string",
-                                     dest="html_id",
-                                     help="")
-        self.OptionParser.add_option("--html-class",
-                                     action="store", type="string",
-                                     dest="html_class",
-                                     help="")
-        self.OptionParser.add_option("--width-unity",
-                                     action="store", type="string",
-                                     dest="width_unity",
-                                     help="")
-        self.OptionParser.add_option("--height-unity",
-                                     action="store", type="string",
-                                     dest="height_unity",
-                                     help="")
-
-
-    def get_base_elements(self):
-        layerArr = self.document.xpath(
-                   '//*[@id="webslicer-layer" and @inkscape:groupmode="layer"]',
-                   namespaces=inkex.NSS)
-        if len(layerArr) > 0:
-            self.layer = layerArr[0]
-        else:
-            inkex.errormsg(_('You must to create and select some "Slicer rectangles" before try to group.'))
-            exit(3)
-        self.layer_descendants = self.get_descendants_in_array(self.layer)
-
-
-    def get_descendants_in_array(self, el):
-        descendants = el.getchildren()
-        for e in descendants:
-            descendants.extend( self.get_descendants_in_array(e) )
-        return descendants
-
-
-    def effect(self):
-        self.get_base_elements()
-        if len(self.selected) == 0:
-            inkex.errormsg(_('You must to select some "Slicer rectangles" or other "Layout groups".'))
-            exit(1)
-        for id,node in self.selected.iteritems():
-            if node not in self.layer_descendants:
-                inkex.errormsg(_('Opss... The element "%s" is not in the Web Slicer layer') % id)
-                exit(2)
-        g_parent = self.getParentNode(node)
-        group = inkex.etree.SubElement(g_parent, 'g')
-        desc = inkex.etree.SubElement(group, 'desc')
-        conf_txt = ''
-        if not is_empty(self.options.html_id):
-            conf_txt += 'html-id:'    + self.options.html_id +'\n'
-        if not is_empty(self.options.html_class):
-            conf_txt += 'html-class:' + self.options.html_class +'\n'
-        conf_txt += 'width-unity:' + self.options.width_unity +'\n'
-        conf_txt += 'height-unity:' + self.options.height_unity
-        desc.text = conf_txt
-        for id,node in self.selected.iteritems():
-            group.insert( 1, node )
-
-
-if __name__ == '__main__':
-    e = WebSlicer_CreateGroup()
-    e.affect()
diff --git a/share/extensions/webslicer-create-rect.inx b/share/extensions/webslicer-create-rect.inx
deleted file mode 100644 (file)
index 7ac681e..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
-  <_name>Create a slicer rectangle</_name>
-  <id>org.inkscape.web.slicer.create-rect</id>
-  <dependency type="executable" location="extensions">webslicer-create-rect.py</dependency>
-  <dependency type="executable" location="extensions">inkex.py</dependency>
-  <param name="name" type="string" _gui-text="Name"></param>
-  <param name="format" type="enum" _gui-text="Format">
-    <item value="png">PNG</item>
-    <item value="jpg">JPG</item>
-    <item value="gif">GIF</item>
-  </param>
-  <param name="dpi" type="float" min="1" max="9999" _gui-text="DPI">90</param>
-  <param name="dimension" type="string" _gui-text="Force Dimension"></param>
-  <_param name="help-dimension1" type="description">Force Dimension must be set as "&lt;width&gt;x&lt;height&gt;"</_param>
-  <_param name="help-dimension2" type="description">If had set, this will replace DPI.</_param>
-  <param name="bg-color" type="string" _gui-text="Background color"></param>
-  <param name="tab" type="notebook">
-    <page name="tabJPG" gui-text="JPG">
-      <_param name="help-jpg" type="description">JPG specific options</_param>
-      <param name="quality" type="int" min="0" max="100" _gui-text="Quality">85</param>
-      <_param name="help-quality" type="description">0 is the lowest image quality and highest compression, and 100 is the best quality but least effective compression</_param>
-    </page>
-    <page name="tabGIF" gui-text="GIF">
-      <_param name="help-gif" type="description">GIF specific options</_param>
-      <param name="gif-type" type="enum" _gui-text="Type">
-        <_item value="grayscale">Grayscale</_item>
-        <_item value="palette">Palette</_item>
-      </param>
-      <param name="palette-size" type="int" min="2" max="256" _gui-text="Palette size">256</param>
-    </page>
-    <page name="tabHTML" gui-text="HTML">
-      <param name="html-id" type="string" _gui-text="HTML id atribute"></param>
-      <param name="html-class" type="string" _gui-text="HTML class atribute"></param>
-      <_param name="help-gif" type="description">Options for HTML export</_param>
-      <param name="layout-disposition" type="enum" _gui-text="Layout disposition">
-        <_item value="bg-parent-repeat">Tiled Background (on parent group)</_item>
-        <_item value="bg-parent-repeat-x">Background — repeat horizontally (on parent group)</_item>
-        <_item value="bg-parent-repeat-y">Background — repeat vertically (on parent group)</_item>
-        <_item value="bg-parent-norepeat">Background — no repeat (on parent group)</_item>
-        <_item value="bg-div-norepeat">Positioned &lt;div&gt; width the image as Background</_item>
-        <_item value="img-pos">Positioned Image</_item>
-        <_item value="img-nonpos">Non Positioned Image</_item>
-        <_item value="img-float-left">Left Floated Image</_item>
-        <_item value="img-float-right">Right Floated Image</_item>
-      </param>
-      <param name="layout-position-anchor" type="enum" _gui-text="Position anchor">
-        <_item value="tl">Top and Left</_item>
-        <_item value="tr">Top and right</_item>
-        <_item value="bl">Bottom and Left</_item>
-        <_item value="br">Bottom and Right</_item>
-      </param>
-    </page>
-  </param>
-  <effect needs-live-preview="false">
-    <object-type>all</object-type>
-    <effects-menu>
-      <submenu _name="Web">
-        <submenu name="Slicer"/>
-      </submenu>
-    </effects-menu>
-  </effect>
-  <script>
-    <command reldir="extensions" interpreter="python">webslicer-create-rect.py</command>
-  </script>
-</inkscape-extension>
diff --git a/share/extensions/webslicer-create-rect.py b/share/extensions/webslicer-create-rect.py
deleted file mode 100755 (executable)
index 957d6a8..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-#!/usr/bin/env python
-'''
-Copyright (C) 2010 Aurelio A. Heckert, aurium (a) gmail dot com
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-'''
-
-import inkex
-import gettext
-
-_ = gettext.gettext
-
-def is_empty(val):
-    if val is None:
-        return True
-    else:
-        return len(str(val)) == 0
-
-class WebSlicer_CreateRect(inkex.Effect):
-
-    def __init__(self):
-        inkex.Effect.__init__(self)
-        self.OptionParser.add_option("--name",
-                                     action="store", type="string",
-                                     dest="name",
-                                     help="")
-        self.OptionParser.add_option("--format",
-                                     action="store", type="string",
-                                     dest="format",
-                                     help="")
-        self.OptionParser.add_option("--dpi",
-                                     action="store", type="int",
-                                     dest="dpi",
-                                     help="")
-        self.OptionParser.add_option("--dimension",
-                                     action="store", type="string",
-                                     dest="dimension",
-                                     help="")
-        self.OptionParser.add_option("--bg-color",
-                                     action="store", type="string",
-                                     dest="bg_color",
-                                     help="")
-        self.OptionParser.add_option("--quality",
-                                     action="store", type="int",
-                                     dest="quality",
-                                     help="")
-        self.OptionParser.add_option("--gif-type",
-                                     action="store", type="string",
-                                     dest="gif_type",
-                                     help="")
-        self.OptionParser.add_option("--palette-size",
-                                     action="store", type="int",
-                                     dest="palette_size",
-                                     help="")
-        self.OptionParser.add_option("--html-id",
-                                     action="store", type="string",
-                                     dest="html_id",
-                                     help="")
-        self.OptionParser.add_option("--html-class",
-                                     action="store", type="string",
-                                     dest="html_class",
-                                     help="")
-        self.OptionParser.add_option("--layout-disposition",
-                                     action="store", type="string",
-                                     dest="layout_disposition",
-                                     help="")
-        self.OptionParser.add_option("--layout-position-anchor",
-                                     action="store", type="string",
-                                     dest="layout_position_anchor",
-                                     help="")
-        # inkscape param workarround
-        self.OptionParser.add_option("--tab")
-
-
-    def unique_slice_name(self):
-        name = self.options.name
-        el = self.document.xpath( '//*[@id="'+name+'"]', namespaces=inkex.NSS )
-        if len(el) > 0:
-            if name[-3:] == '-00': name = name[:-3]
-            num = 0
-            num_s = '00'
-            while len(el) > 0:
-                num += 1
-                num_s = str(num)
-                if len(num_s)==1 : num_s = '0'+num_s
-                el = self.document.xpath( '//*[@id="'+name+'-'+num_s+'"]',
-                                          namespaces=inkex.NSS )
-            self.options.name = name+'-'+num_s
-
-
-    def validate_options(self):
-        self.options.format = self.options.ensure_value('format', 'png').lower()
-        if not is_empty( self.options.dimension ):
-            self.options.dimension
-
-    def effect(self):
-        self.validate_options()
-        layer = self.get_slicer_layer()
-        #TODO: get selected elements to define location and size
-        rect = inkex.etree.SubElement(layer, 'rect')
-        if is_empty(self.options.name):
-            self.options.name = 'slice-00'
-        self.unique_slice_name()
-        rect.set('id', self.options.name)
-        rect.set('fill', 'red')
-        rect.set('opacity', '0.5')
-        rect.set('x', '-100')
-        rect.set('y', '-100')
-        rect.set('width', '200')
-        rect.set('height', '200')
-        desc = inkex.etree.SubElement(rect, 'desc')
-        conf_txt = "format:"+ self.options.format +"\n"
-        if not is_empty(self.options.dpi):
-            conf_txt += "dpi:"     + str(self.options.dpi) +"\n"
-        if not is_empty(self.options.html_id):
-            conf_txt += "html-id:" + self.options.html_id
-        desc.text = "\n".join( self.get_full_conf_list() )
-
-
-
-    def get_conf_from_list(self, conf_atts):
-        conf_list = []
-        for att in conf_atts:
-            if not is_empty(getattr(self.options, att)):
-                conf_list.append( att +':'+ str(getattr(self.options, att)) )
-        return conf_list
-
-
-    def get_full_conf_list(self):
-        conf_list = [ 'format:'+self.options.format ]
-        if self.options.format == 'gif':
-            conf_list.extend( get_conf_from_list([ 'gif_type', 'palette_size' ]) )
-        if self.options.format == 'jpg':
-            conf_list.extend( get_conf_from_list([ 'quality' ]) )
-        conf_general_atts = [
-                'dpi', 'dimension',
-                'bg_color', 'html_id', 'html_class',
-                'layout_disposition', 'layout_position_anchor'
-            ]
-        conf_list.extend( get_conf_from_list(conf_general_atts) )
-        return conf_list
-
-
-    def get_slicer_layer(self):
-        # Test if webslicer-layer layer existis
-        layer = self.document.xpath(
-                     '//*[@id="webslicer-layer" and @inkscape:groupmode="layer"]',
-                     namespaces=inkex.NSS)
-        if len(layer) is 0:
-            # Create a new layer
-            layer = inkex.etree.SubElement(self.document.getroot(), 'g')
-            layer.set('id', 'webslicer-layer')
-            layer.set(inkex.addNS('label', 'inkscape'), 'Web Slicer')
-            layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')
-        else:
-            layer = layer[0]
-        return layer
-
-
-if __name__ == '__main__':
-    e = WebSlicer_CreateRect()
-    e.affect()
diff --git a/share/extensions/webslicer-export.inx b/share/extensions/webslicer-export.inx
deleted file mode 100644 (file)
index 9f7aac3..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
-  <_name>Export layout pieces and HTML+CSS code</_name>
-  <id>org.inkscape.web.slicer.export</id>
-  <dependency type="executable" location="extensions">webslicer-export.py</dependency>
-  <dependency type="executable" location="extensions">inkex.py</dependency>
-  <_param name="about" type="description">All sliced images, and optionaly code, will be generated as you had configured and saved to one directory.</_param>
-  <param name="dir" type="string" _gui-text="Directory path to export"></param>
-  <param name="with-code" type="boolean" _gui-text="With HTML and CSS">true</param>
-  <effect needs-live-preview="false">
-    <object-type>all</object-type>
-    <effects-menu>
-      <submenu _name="Web">
-        <submenu name="Slicer"/>
-      </submenu>
-    </effects-menu>
-  </effect>
-  <script>
-    <command reldir="extensions" interpreter="python">webslicer-export.py</command>
-  </script>
-</inkscape-extension>
diff --git a/share/extensions/webslicer-export.py b/share/extensions/webslicer-export.py
deleted file mode 100755 (executable)
index c8e4cbb..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/env python
-'''
-Copyright (C) 2010 Aurelio A. Heckert, aurium (a) gmail dot com
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-'''
-
-import inkex
-import gettext
-import os.path
-import commands
-
-_ = gettext.gettext
-
-def is_empty(val):
-    if val is None:
-        return True
-    else:
-        return len(str(val)) == 0
-
-class WebSlicer_Export(inkex.Effect):
-
-    def __init__(self):
-        inkex.Effect.__init__(self)
-        self.OptionParser.add_option("--with-code",
-                                     action="store", type="string",
-                                     dest="with_code",
-                                     help="")
-        self.OptionParser.add_option("--dir",
-                                     action="store", type="string",
-                                     dest="dir",
-                                     help="")
-
-    def effect(self):
-        if is_empty( self.options.dir ):
-            inkex.errormsg(_('You must to give a directory to export the slices.'))
-            return
-        if not os.path.exists( self.options.dir ):
-            inkex.errormsg(_('The directory "%s" does not exists.') % self.options.dir)
-            return
-        (status, output) = commands.getstatusoutput("inkscape -e ...")
-
-
-if __name__ == '__main__':
-    e = WebSlicer_Export()
-    e.affect()
diff --git a/share/extensions/webslicer_create_group.inx b/share/extensions/webslicer_create_group.inx
new file mode 100644 (file)
index 0000000..3e4a66d
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
+  <_name>Set a layout group</_name>
+  <id>org.inkscape.web.slicer.create-group</id>
+  <dependency type="executable" location="extensions">webslicer_effect.py</dependency>
+  <dependency type="executable" location="extensions">webslicer_create_group.py</dependency>
+  <dependency type="executable" location="extensions">inkex.py</dependency>
+  <_param name="about" type="description">Layout Group is only about to help a better code generation (if you need it). To use this, first you must to select some "Slicer rectangles".</_param>
+  <param name="html-id" type="string" _gui-text="HTML id atribute"></param>
+  <param name="html-class" type="string" _gui-text="HTML class atribute"></param>
+  <param name="width-unity" type="enum" _gui-text="Width Unity">
+    <_item value="px">Pixel (fixed)</_item>
+    <_item value="percent">Percent (relative to parent size)</_item>
+    <_item value="undefined">Undefined (relative to non-floating content size)</_item>
+  </param>
+  <param name="height-unity" type="enum" _gui-text="Height Unity">
+    <_item value="px">Pixel (fixed)</_item>
+    <_item value="percent">Percent (relative to parent size)</_item>
+    <_item value="undefined">Undefined (relative to non-floating content size)</_item>
+  </param>
+  <effect needs-live-preview="false">
+    <object-type>all</object-type>
+    <effects-menu>
+      <submenu _name="Web">
+        <submenu name="Slicer"/>
+      </submenu>
+    </effects-menu>
+  </effect>
+  <script>
+    <command reldir="extensions" interpreter="python">webslicer_create_group.py</command>
+  </script>
+</inkscape-extension>
diff --git a/share/extensions/webslicer_create_group.py b/share/extensions/webslicer_create_group.py
new file mode 100755 (executable)
index 0000000..aadfded
--- /dev/null
@@ -0,0 +1,98 @@
+#!/usr/bin/env python
+'''
+Copyright (C) 2010 Aurelio A. Heckert, aurium (a) gmail dot com
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+'''
+
+import inkex
+import gettext
+
+_ = gettext.gettext
+
+def is_empty(val):
+    if val is None:
+        return True
+    else:
+        return len(str(val)) == 0
+
+class WebSlicer_CreateGroup(inkex.Effect):
+
+    def __init__(self):
+        inkex.Effect.__init__(self)
+        self.OptionParser.add_option("--html-id",
+                                     action="store", type="string",
+                                     dest="html_id",
+                                     help="")
+        self.OptionParser.add_option("--html-class",
+                                     action="store", type="string",
+                                     dest="html_class",
+                                     help="")
+        self.OptionParser.add_option("--width-unity",
+                                     action="store", type="string",
+                                     dest="width_unity",
+                                     help="")
+        self.OptionParser.add_option("--height-unity",
+                                     action="store", type="string",
+                                     dest="height_unity",
+                                     help="")
+
+
+    def get_base_elements(self):
+        layerArr = self.document.xpath(
+                   '//*[@id="webslicer-layer" and @inkscape:groupmode="layer"]',
+                   namespaces=inkex.NSS)
+        if len(layerArr) > 0:
+            self.layer = layerArr[0]
+        else:
+            inkex.errormsg(_('You must to create and select some "Slicer rectangles" before try to group.'))
+            exit(3)
+        self.layer_descendants = self.get_descendants_in_array(self.layer)
+
+
+    def get_descendants_in_array(self, el):
+        descendants = el.getchildren()
+        for e in descendants:
+            descendants.extend( self.get_descendants_in_array(e) )
+        return descendants
+
+
+    def effect(self):
+        self.get_base_elements()
+        if len(self.selected) == 0:
+            inkex.errormsg(_('You must to select some "Slicer rectangles" or other "Layout groups".'))
+            exit(1)
+        for id,node in self.selected.iteritems():
+            if node not in self.layer_descendants:
+                inkex.errormsg(_('Opss... The element "%s" is not in the Web Slicer layer') % id)
+                exit(2)
+        g_parent = self.getParentNode(node)
+        group = inkex.etree.SubElement(g_parent, 'g')
+        desc = inkex.etree.SubElement(group, 'desc')
+        conf_txt = ''
+        if not is_empty(self.options.html_id):
+            conf_txt += 'html-id:'    + self.options.html_id +'\n'
+        if not is_empty(self.options.html_class):
+            conf_txt += 'html-class:' + self.options.html_class +'\n'
+        conf_txt += 'width-unity:' + self.options.width_unity +'\n'
+        conf_txt += 'height-unity:' + self.options.height_unity
+        desc.text = conf_txt
+        for id,node in self.selected.iteritems():
+            group.insert( 1, node )
+
+
+if __name__ == '__main__':
+    e = WebSlicer_CreateGroup()
+    e.affect()
diff --git a/share/extensions/webslicer_create_rect.inx b/share/extensions/webslicer_create_rect.inx
new file mode 100644 (file)
index 0000000..776d269
--- /dev/null
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
+  <_name>Create a slicer rectangle</_name>
+  <id>org.inkscape.web.slicer.create-rect</id>
+  <dependency type="executable" location="extensions">webslicer_effect.py</dependency>
+  <dependency type="executable" location="extensions">webslicer_create_rect.py</dependency>
+  <dependency type="executable" location="extensions">inkex.py</dependency>
+  <param name="name" type="string" _gui-text="Name"></param>
+  <param name="format" type="enum" _gui-text="Format">
+    <item value="png">PNG</item>
+    <item value="jpg">JPG</item>
+    <item value="gif">GIF</item>
+  </param>
+  <param name="dpi" type="float" min="1" max="9999" _gui-text="DPI">90</param>
+  <param name="dimension" type="string" _gui-text="Force Dimension"></param>
+  <_param name="help-dimension1" type="description">Force Dimension must be set as "&lt;width&gt;x&lt;height&gt;"</_param>
+  <_param name="help-dimension2" type="description">If had set, this will replace DPI.</_param>
+  <param name="bg-color" type="string" _gui-text="Background color"></param>
+  <param name="tab" type="notebook">
+    <page name="tabJPG" gui-text="JPG">
+      <_param name="help-jpg" type="description">JPG specific options</_param>
+      <param name="quality" type="int" min="0" max="100" _gui-text="Quality">85</param>
+      <_param name="help-quality" type="description">0 is the lowest image quality and highest compression, and 100 is the best quality but least effective compression</_param>
+    </page>
+    <page name="tabGIF" gui-text="GIF">
+      <_param name="help-gif" type="description">GIF specific options</_param>
+      <param name="gif-type" type="enum" _gui-text="Type">
+        <_item value="grayscale">Grayscale</_item>
+        <_item value="palette">Palette</_item>
+      </param>
+      <param name="palette-size" type="int" min="2" max="256" _gui-text="Palette size">256</param>
+    </page>
+    <page name="tabHTML" gui-text="HTML">
+      <param name="html-id" type="string" _gui-text="HTML id atribute"></param>
+      <param name="html-class" type="string" _gui-text="HTML class atribute"></param>
+      <_param name="help-gif" type="description">Options for HTML export</_param>
+      <param name="layout-disposition" type="enum" _gui-text="Layout disposition">
+        <_item value="bg-parent-repeat">Tiled Background (on parent group)</_item>
+        <_item value="bg-parent-repeat-x">Background — repeat horizontally (on parent group)</_item>
+        <_item value="bg-parent-repeat-y">Background — repeat vertically (on parent group)</_item>
+        <_item value="bg-parent-norepeat">Background — no repeat (on parent group)</_item>
+        <_item value="bg-div-norepeat">Positioned &lt;div&gt; width the image as Background</_item>
+        <_item value="img-pos">Positioned Image</_item>
+        <_item value="img-nonpos">Non Positioned Image</_item>
+        <_item value="img-float-left">Left Floated Image</_item>
+        <_item value="img-float-right">Right Floated Image</_item>
+      </param>
+      <param name="layout-position-anchor" type="enum" _gui-text="Position anchor">
+        <_item value="tl">Top and Left</_item>
+        <_item value="tr">Top and right</_item>
+        <_item value="bl">Bottom and Left</_item>
+        <_item value="br">Bottom and Right</_item>
+      </param>
+    </page>
+  </param>
+  <effect needs-live-preview="false">
+    <object-type>all</object-type>
+    <effects-menu>
+      <submenu _name="Web">
+        <submenu name="Slicer"/>
+      </submenu>
+    </effects-menu>
+  </effect>
+  <script>
+    <command reldir="extensions" interpreter="python">webslicer_create_rect.py</command>
+  </script>
+</inkscape-extension>
diff --git a/share/extensions/webslicer_create_rect.py b/share/extensions/webslicer_create_rect.py
new file mode 100755 (executable)
index 0000000..8c1e5e5
--- /dev/null
@@ -0,0 +1,160 @@
+#!/usr/bin/env python
+'''
+Copyright (C) 2010 Aurelio A. Heckert, aurium (a) gmail dot com
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+'''
+
+import webslicer_effect
+import inkex
+import gettext
+
+_ = gettext.gettext
+
+def is_empty(val):
+    if val is None:
+        return True
+    else:
+        return len(str(val)) == 0
+
+class WebSlicer_CreateRect(webslicer_effect.WebSlicer_Effect):
+
+    def __init__(self):
+        webslicer_effect.WebSlicer_Effect.__init__(self)
+        self.OptionParser.add_option("--name",
+                                     action="store", type="string",
+                                     dest="name",
+                                     help="")
+        self.OptionParser.add_option("--format",
+                                     action="store", type="string",
+                                     dest="format",
+                                     help="")
+        self.OptionParser.add_option("--dpi",
+                                     action="store", type="int",
+                                     dest="dpi",
+                                     help="")
+        self.OptionParser.add_option("--dimension",
+                                     action="store", type="string",
+                                     dest="dimension",
+                                     help="")
+        self.OptionParser.add_option("--bg-color",
+                                     action="store", type="string",
+                                     dest="bg_color",
+                                     help="")
+        self.OptionParser.add_option("--quality",
+                                     action="store", type="int",
+                                     dest="quality",
+                                     help="")
+        self.OptionParser.add_option("--gif-type",
+                                     action="store", type="string",
+                                     dest="gif_type",
+                                     help="")
+        self.OptionParser.add_option("--palette-size",
+                                     action="store", type="int",
+                                     dest="palette_size",
+                                     help="")
+        self.OptionParser.add_option("--html-id",
+                                     action="store", type="string",
+                                     dest="html_id",
+                                     help="")
+        self.OptionParser.add_option("--html-class",
+                                     action="store", type="string",
+                                     dest="html_class",
+                                     help="")
+        self.OptionParser.add_option("--layout-disposition",
+                                     action="store", type="string",
+                                     dest="layout_disposition",
+                                     help="")
+        self.OptionParser.add_option("--layout-position-anchor",
+                                     action="store", type="string",
+                                     dest="layout_position_anchor",
+                                     help="")
+        # inkscape param workarround
+        self.OptionParser.add_option("--tab")
+
+
+    def unique_slice_name(self):
+        name = self.options.name
+        el = self.document.xpath( '//*[@id="'+name+'"]', namespaces=inkex.NSS )
+        if len(el) > 0:
+            if name[-3:] == '-00': name = name[:-3]
+            num = 0
+            num_s = '00'
+            while len(el) > 0:
+                num += 1
+                num_s = str(num)
+                if len(num_s)==1 : num_s = '0'+num_s
+                el = self.document.xpath( '//*[@id="'+name+'-'+num_s+'"]',
+                                          namespaces=inkex.NSS )
+            self.options.name = name+'-'+num_s
+
+
+    def validate_options(self):
+        self.options.format = self.options.ensure_value('format', 'png').lower()
+        if not is_empty( self.options.dimension ):
+            self.options.dimension
+
+    def effect(self):
+        self.validate_options()
+        layer = self.get_slicer_layer(True)
+        #TODO: get selected elements to define location and size
+        rect = inkex.etree.SubElement(layer, 'rect')
+        if is_empty(self.options.name):
+            self.options.name = 'slice-00'
+        self.unique_slice_name()
+        rect.set('id', self.options.name)
+        rect.set('fill', 'red')
+        rect.set('opacity', '0.5')
+        rect.set('x', '-100')
+        rect.set('y', '-100')
+        rect.set('width', '200')
+        rect.set('height', '200')
+        desc = inkex.etree.SubElement(rect, 'desc')
+        conf_txt = "format:"+ self.options.format +"\n"
+        if not is_empty(self.options.dpi):
+            conf_txt += "dpi:"     + str(self.options.dpi) +"\n"
+        if not is_empty(self.options.html_id):
+            conf_txt += "html-id:" + self.options.html_id
+        desc.text = "\n".join( self.get_full_conf_list() )
+
+
+
+    def get_conf_from_list(self, conf_atts):
+        conf_list = []
+        for att in conf_atts:
+            if not is_empty(getattr(self.options, att)):
+                conf_list.append( att +':'+ str(getattr(self.options, att)) )
+        return conf_list
+
+
+    def get_full_conf_list(self):
+        conf_list = [ 'format:'+self.options.format ]
+        if self.options.format == 'gif':
+            conf_list.extend( self.get_conf_from_list([ 'gif_type', 'palette_size' ]) )
+        if self.options.format == 'jpg':
+            conf_list.extend( self.get_conf_from_list([ 'quality' ]) )
+        conf_general_atts = [
+                'dpi', 'dimension',
+                'bg_color', 'html_id', 'html_class',
+                'layout_disposition', 'layout_position_anchor'
+            ]
+        conf_list.extend( self.get_conf_from_list(conf_general_atts) )
+        return conf_list
+
+
+
+if __name__ == '__main__':
+    e = WebSlicer_CreateRect()
+    e.affect()
diff --git a/share/extensions/webslicer_effect.py b/share/extensions/webslicer_effect.py
new file mode 100644 (file)
index 0000000..37bea44
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/env python
+'''
+Copyright (C) 2010 Aurelio A. Heckert, aurium (a) gmail dot com
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+'''
+
+import inkex
+
+
+def is_empty(val):
+    if val is None:
+        return True
+    else:
+        return len(str(val)) == 0
+
+
+class WebSlicer_Effect(inkex.Effect):
+
+    def __init__(self):
+        inkex.Effect.__init__(self)
+
+    def get_slicer_layer(self, force_creation=False):
+        # Test if webslicer-layer layer existis
+        layer = self.document.xpath(
+                     '//*[@id="webslicer-layer" and @inkscape:groupmode="layer"]',
+                     namespaces=inkex.NSS)
+        if len(layer) is 0:
+            if force_creation:
+                # Create a new layer
+                layer = inkex.etree.SubElement(self.document.getroot(), 'g')
+                layer.set('id', 'webslicer-layer')
+                layer.set(inkex.addNS('label', 'inkscape'), 'Web Slicer')
+                layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')
+            else:
+                layer = None
+        else:
+            layer = layer[0]
+        return layer
+
diff --git a/share/extensions/webslicer_export.inx b/share/extensions/webslicer_export.inx
new file mode 100644 (file)
index 0000000..2434c95
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
+  <_name>Export layout pieces and HTML+CSS code</_name>
+  <id>org.inkscape.web.slicer.export</id>
+  <dependency type="executable" location="extensions">webslicer_effect.py</dependency>
+  <dependency type="executable" location="extensions">webslicer_export.py</dependency>
+  <dependency type="executable" location="extensions">inkex.py</dependency>
+  <_param name="about" type="description">All sliced images, and optionaly code, will be generated as you had configured and saved to one directory.</_param>
+  <param name="dir" type="string" _gui-text="Directory path to export"></param>
+  <param name="with-code" type="boolean" _gui-text="With HTML and CSS">true</param>
+  <effect needs-live-preview="false">
+    <object-type>all</object-type>
+    <effects-menu>
+      <submenu _name="Web">
+        <submenu name="Slicer"/>
+      </submenu>
+    </effects-menu>
+  </effect>
+  <script>
+    <command reldir="extensions" interpreter="python">webslicer_export.py</command>
+  </script>
+</inkscape-extension>
diff --git a/share/extensions/webslicer_export.py b/share/extensions/webslicer_export.py
new file mode 100755 (executable)
index 0000000..1d5057a
--- /dev/null
@@ -0,0 +1,55 @@
+#!/usr/bin/env python
+'''
+Copyright (C) 2010 Aurelio A. Heckert, aurium (a) gmail dot com
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+'''
+
+import webslicer_effect
+import inkex
+import gettext
+import os.path
+import commands
+
+_ = gettext.gettext
+
+class WebSlicer_Export(webslicer_effect.WebSlicer_Effect):
+
+    def __init__(self):
+        webslicer_effect.WebSlicer_Effect.__init__(self)
+        self.OptionParser.add_option("--with-code",
+                                     action="store", type="string",
+                                     dest="with_code",
+                                     help="")
+        self.OptionParser.add_option("--dir",
+                                     action="store", type="string",
+                                     dest="dir",
+                                     help="")
+
+    def effect(self):
+        if is_empty( self.options.dir ):
+            inkex.errormsg(_('You must to give a directory to export the slices.'))
+            return
+        if not os.path.exists( self.options.dir ):
+            inkex.errormsg(_('The directory "%s" does not exists.') % self.options.dir)
+            return
+        (status, output) = commands.getstatusoutput("inkscape -e ...")
+        inkex.errormsg( status )
+        inkex.errormsg( output )
+
+
+if __name__ == '__main__':
+    e = WebSlicer_Export()
+    e.affect()