diff --git a/lib/sanitizer.rb b/lib/sanitizer.rb
index d5052b94..43e69b40 100644
--- a/lib/sanitizer.rb
+++ b/lib/sanitizer.rb
@@ -10,12 +10,14 @@ module Sanitizer
require 'stringsupport'
require 'set'
- acceptable_elements = Set.new %w[a abbr acronym address area audio b big blockquote br
- button caption center cite code col colgroup dd del dfn dir div dl dt
- em fieldset font form h1 h2 h3 h4 h5 h6 hr i img input ins kbd label
- legend li map menu ol optgroup option p pre q s samp select small span
- strike strong sub sup table tbody td textarea tfoot th thead tr tt u
- ul var video]
+ acceptable_elements = Set.new %w[a abbr acronym address area article aside
+ audio b big blockquote br button canvas caption center cite code
+ col colgroup command dd del details dfn dialog dir div dl dt
+ em fieldset figcaption figure font footer form h1 h2 h3 h4 h5 h6 header
+ hgroup hr i img input ins kbd label legend li map mark menu meter nav
+ ol optgroup option p pre progress q rp rt ruby s samp section select small
+ source span strike strong sub summary sup table tbody td textarea tfoot
+ th thead time tr tt u ul var video wbr]
mathml_elements = Set.new %w[annotation annotation-xml maction math merror mfrac
mfenced mi mmultiscripts mn mo mover mpadded mphantom mprescripts mroot
@@ -28,15 +30,15 @@ module Sanitizer
line marker mask metadata missing-glyph mpath path pattern polygon
polyline radialGradient rect set stop svg switch text textPath title tspan use]
- acceptable_attributes = Set.new %w[abbr accept accept-charset accesskey action
- align alt axis border cellpadding cellspacing char charoff charset
- checked cite class clear cols colspan color compact controls coords datetime
- dir disabled enctype for frame headers height href hreflang hspace id
- ismap label lang longdesc loop loopcount loopend loopstart
- maxlength media method multiple name nohref
- noshade nowrap poster prompt readonly rel rev rows rowspan rules scope
- selected shape size span src start style summary tabindex target title
- type usemap valign value vspace width xml:lang]
+ acceptable_attributes = Set.new %w[accept accept-charset accesskey action
+ align alt autocomplete axis border cellpadding cellspacing char charoff
+ checked cite class clear cols colspan color compact contenteditable contextmenu
+ controls coords datetime dir disabled draggable enctype for formaction frame
+ headers height href hreflang hspace icon id ismap label lang longdesc loop low
+ max maxlength media method min multiple name nohref open optimum pattern placeholder
+ poster preload pubdate readonly rel required reversed rows rowspan spellcheck scope
+ selected shape size span src start step style summary tabindex target title
+ type usemap valign value vspace width wrap xml:lang]
mathml_attributes = Set.new %w[actiontype align close
columnalign columnlines columnspacing columnspan depth display
@@ -73,7 +75,7 @@ module Sanitizer
xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type
xml:base xml:lang xml:space xmlns xmlns:xlink xmlns:se y y1 y2 zoomAndPan]
- attr_val_is_uri = Set.new %w[href src cite action longdesc xlink:href xml:base]
+ attr_val_is_uri = Set.new %w[href src cite action formaction longdesc xlink:href xml:base]
svg_attr_val_allows_ref = Set.new %w[clip-path color-profile cursor fill
filter marker marker-start marker-mid marker-end mask stroke]
diff --git a/public/svg-edit/editor/images/node_clone.png b/public/svg-edit/editor/images/node_clone.png
new file mode 100755
index 00000000..2187d073
Binary files /dev/null and b/public/svg-edit/editor/images/node_clone.png differ
diff --git a/public/svg-edit/editor/images/node_delete.png b/public/svg-edit/editor/images/node_delete.png
new file mode 100755
index 00000000..ea3f7e68
Binary files /dev/null and b/public/svg-edit/editor/images/node_delete.png differ
diff --git a/public/svg-edit/editor/images/svg_edit_icons.svg b/public/svg-edit/editor/images/svg_edit_icons.svg
index 20a06612..f5e22ade 100644
--- a/public/svg-edit/editor/images/svg_edit_icons.svg
+++ b/public/svg-edit/editor/images/svg_edit_icons.svg
@@ -946,6 +946,30 @@
+
+
+
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/public/svg-edit/editor/locale/lang.fr.js b/public/svg-edit/editor/locale/lang.fr.js
index ab03da9f..de8e2302 100644
--- a/public/svg-edit/editor/locale/lang.fr.js
+++ b/public/svg-edit/editor/locale/lang.fr.js
@@ -4,7 +4,7 @@
{"id": "circle_cx", "title": "Changer la position horizontale cx du cercle"},
{"id": "circle_cy", "title": "Changer la position verticale cy du cercle"},
{"id": "circle_r", "title": "Changer le rayon du cercle"},
-{"id": "connector_no_arrow", "textContent": "No arrow"},
+{"id": "connector_no_arrow", "textContent": "Sans flèches"},
{"id": "copyrightLabel", "textContent": "Powered by"},
{"id": "cornerRadiusLabel", "title": "Changer le rayon des coins du rectangle"},
{"id": "curve_segments", "textContent": "Courbe"},
@@ -23,6 +23,7 @@
{"id": "icon_medium", "textContent": "Moyenne"},
{"id": "icon_small", "textContent": "Petite"},
{"id": "icon_xlarge", "textContent": "Super-Grande"},
+{"id": "idLabel", "title": "Identifier l'élément"},
{"id": "image_height", "title": "Changer la hauteur de l'image"},
{"id": "image_opt_embed", "textContent": "Incorporer les images en tant que données (fichiers locaux)"},
{"id": "image_opt_ref", "textContent": "Utiliser la référence des images "},
@@ -40,14 +41,14 @@
{"id": "line_x2", "title": "Changer la position horizontale x de fin de la ligne"},
{"id": "line_y1", "title": "Changer la position verticale y de début de la ligne"},
{"id": "line_y2", "title": "Changer la position verticale y de fin de la ligne"},
-{"id": "linecap_butt", "title": "Linecap: Butt"},
-{"id": "linecap_round", "title": "Linecap: Round"},
-{"id": "linecap_square", "title": "Linecap: Square"},
-{"id": "linejoin_bevel", "title": "Linejoin: Bevel"},
-{"id": "linejoin_miter", "title": "Linejoin: Miter"},
-{"id": "linejoin_round", "title": "Linejoin: Round"},
-{"id": "main_icon", "title": "Main Menu"},
-{"id": "mode_connect", "title": "Connect two objects"},
+{"id": "linecap_butt", "title": "Terminaison : Sur le nœud"},
+{"id": "linecap_round", "title": "Terminaison : Arrondie"},
+{"id": "linecap_square", "title": "Terminaison : Carrée"},
+{"id": "linejoin_bevel", "title": "Raccord : Biseauté"},
+{"id": "linejoin_miter", "title": "Raccord : Droit"},
+{"id": "linejoin_round", "title": "Raccord : Arrondi"},
+{"id": "main_icon", "title": "Menu principal"},
+{"id": "mode_connect", "title": "Connecter deux objets"},
{"id": "page", "textContent": "Page"},
{"id": "palette", "title": "Cliquer pour changer la couleur de remplissage, Shift-Clic pour changer la couleur de contour"},
{"id": "path_node_x", "title": "Changer la positon horizontale x du nœud"},
@@ -66,7 +67,7 @@
{"id": "straight_segments", "textContent": "Droit"},
{"id": "stroke_color", "title": "Changer la couleur du contour"},
{"id": "stroke_style", "title": "Changer le style du contour"},
-{"id": "stroke_width", "title": "Changer la largeur du contour"},
+{"id": "stroke_width", "title": "Changer la largeur du contour de 1, Shift-Click pour changer la largeur de 0.1"},
{"id": "svginfo_bg_note", "textContent": "Note: La toile de fond n'est pas sauvegardée avec l'image."},
{"id": "svginfo_change_background", "textContent": "Toile de fond de l'Éditeur"},
{"id": "svginfo_dim", "textContent": "Dimensions du canevas"},
@@ -78,8 +79,8 @@
{"id": "svginfo_title", "textContent": "Titre"},
{"id": "svginfo_width", "textContent": "Largeur:"},
{"id": "text", "title": "Changer le contenu du texte"},
-{"id": "toggle_stroke_tools", "title": "Show/hide more stroke tools"},
-{"id": "tool_add_subpath", "title": "Add sub-path"},
+{"id": "toggle_stroke_tools", "title": "Montrer/Cacher plus d'outils de Contour"},
+{"id": "tool_add_subpath", "title": "Ajouter un sous-chemin"},
{"id": "tool_alignbottom", "title": "Aligner le bas des objets"},
{"id": "tool_aligncenter", "title": "Centrer verticalement"},
{"id": "tool_alignleft", "title": "Aligner les côtés gauches"},
@@ -87,7 +88,7 @@
{"id": "tool_alignright", "title": "Aligner les côtés droits"},
{"id": "tool_aligntop", "title": "Aligner le haut des objets"},
{"id": "tool_angle", "title": "Changer l'angle de rotation"},
-{"id": "tool_blur", "title": "Change gaussian blur value"},
+{"id": "tool_blur", "title": "Changer la valeur du flou gaussien"},
{"id": "tool_bold", "title": "Texte en gras"},
{"id": "tool_circle", "title": "Cercle"},
{"id": "tool_clear", "textContent": "Nouvelle image"},
@@ -99,15 +100,15 @@
{"id": "tool_docprops_cancel", "textContent": "Annuler"},
{"id": "tool_docprops_save", "textContent": "OK"},
{"id": "tool_ellipse", "title": "Ellipse"},
-{"id": "tool_export", "textContent": "Export as PNG"},
-{"id": "tool_eyedropper", "title": "Eye Dropper Tool"},
+{"id": "tool_export", "textContent": "Exporter au format PNG"},
+{"id": "tool_eyedropper", "title": "Outil Pipette"},
{"id": "tool_fhellipse", "title": "Ellipse main levée"},
{"id": "tool_fhpath", "title": "Crayon à main levée"},
{"id": "tool_fhrect", "title": "Rectangle main levée"},
-{"id": "tool_font_size", "title": "Taille de la police"},
+{"id": "tool_font_size", "title": "Changer la taille de la police"},
{"id": "tool_group", "title": "Grouper les éléments"},
{"id": "tool_image", "title": "Outil Image"},
-{"id": "tool_import", "textContent": "Import SVG"},
+{"id": "tool_import", "textContent": "Importer un objet SVG"},
{"id": "tool_italic", "title": "Texte en italique"},
{"id": "tool_line", "title": "Tracer des lignes"},
{"id": "tool_move_bottom", "title": "Déplacer vers le bas"},
@@ -115,9 +116,11 @@
{"id": "tool_node_clone", "title": "Cloner le nœud"},
{"id": "tool_node_delete", "title": "Supprimer le nœud"},
{"id": "tool_node_link", "title": "Rendre les points de contrôle solidaires"},
-{"id": "tool_opacity", "title": "Changer l'opacité de l'élément"},
+{"id": "tool_opacity", "title": "Changer l'opacité de l'élément sélectionné"},
{"id": "tool_open", "textContent": "Ouvrir une image"},
+{"id": "tool_openclose_path", "title": "Ouvrir/Fermer sous-chemin"},
{"id": "tool_path", "title": "Outil Chemin"},
+{"id": "tool_position", "title": "Aligner l'élément relativement à la Page"},
{"id": "tool_rect", "title": "Rectangle"},
{"id": "tool_redo", "title": "Refaire l'action"},
{"id": "tool_reorient", "title": "Réorienter le chemin"},
@@ -133,7 +136,7 @@
{"id": "tool_ungroup", "title": "Dégrouper les éléments"},
{"id": "tool_wireframe", "title": "Mode Fil de Fer"},
{"id": "tool_zoom", "title": "Zoom"},
-{"id": "url_notice", "title": "NOTE: This image cannot be embedded. It will depend on this path to be displayed"},
+{"id": "url_notice", "title": "NOTE: Cette image ne peut être incorporée en tant que données. Le contenu affiché sera celui de l'image située à cette adresse"},
{"id": "zoom_panel", "title": "Changer le niveau de zoom"},
{"id": "sidepanel_handle", "textContent": "C A L Q U E S", "title": "Tirer vers la gauche/droite pour redimensionner le panneau"},
{
@@ -143,16 +146,16 @@
"QmoveElemsToLayer": "Déplacer les éléments sélectionnés vers le calque '%s' ?",
"QwantToClear": "Voulez-vous effacer le dessin ?\nL'historique de vos actions sera également effacé !",
"cancel": "Annuler",
- "defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
+ "defsFailOnSave": "NOTE : À cause d'un bug de votre navigateur, cette image peut être affichée de façon incorrecte (dégradés ou éléments manquants). Cependant, une fois enregistrée, elle sera correcte.",
"dupeLayerName": "Il existe déjà un calque de ce nom !",
"enterNewImgURL": "Entrer la nouvelle URL de l'image",
"enterNewLayerName": "Veuillez entrer le nouveau nom du calque",
"enterUniqueLayerName": "Veuillez entrer un nom (unique) pour le calque",
- "exportNoBlur": "Blurred elements will appear as un-blurred",
- "exportNoDashArray": "Strokes will appear filled",
- "exportNoImage": "Image elements will not appear",
- "exportNoText": "Text may not appear as expected",
- "exportNoforeignObject": "foreignObject elements will not appear",
+ "exportNoBlur": "Les éléments ayant du flou gaussien seront affichés sans flou",
+ "exportNoDashArray": "Les contours seront affichés remplis",
+ "exportNoImage": "Les éléments Image ne seront pas affichés",
+ "exportNoText": "Le texte peut être affiché de façon incorrecte",
+ "exportNoforeignObject": "Les éléments foreignObject se seront pas affichés",
"featNotSupported": "Fonction non supportée",
"invalidAttrValGiven": "Valeur fournie invalide",
"key_backspace": "Suppr.",
@@ -161,13 +164,13 @@
"key_up": "Haut",
"layer": "Calque",
"layerHasThatName": "Le calque porte déjà ce nom",
- "loadingImage": "Loading image, please wait...",
+ "loadingImage": "Chargement de l'image, veuillez patienter...",
"noContentToFitTo": "Il n'y a pas de contenu auquel ajuster",
- "noteTheseIssues": "Also note the following issues: ",
+ "noteTheseIssues": "Notez également les problèmes suivants : ",
"ok": "OK",
"pathCtrlPtTooltip": "Glisser-déposer le point de contrôle pour ajuster les propriétés de la courbe",
"pathNodeTooltip": "Glisser-déposer le nœud pour le déplacer. Double-cliquer le nœud pour changer de type de segment",
- "saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file."
+ "saveFromBrowser": "Selectionner \"Enregistrer sous...\" dans votre navigateur pour sauvegarder l'image en tant que fichier %s."
}
}
]
\ No newline at end of file
diff --git a/public/svg-edit/editor/locale/lang.nl.js b/public/svg-edit/editor/locale/lang.nl.js
index 04d11064..8c7cd41c 100644
--- a/public/svg-edit/editor/locale/lang.nl.js
+++ b/public/svg-edit/editor/locale/lang.nl.js
@@ -4,8 +4,8 @@
{"id": "circle_cx", "title": "Verander het X coordinaat van het cirkel middelpunt"},
{"id": "circle_cy", "title": "Verander het Y coordinaat van het cirkel middelpunt"},
{"id": "circle_r", "title": "Verander de cirkel radius"},
-{"id": "connector_no_arrow", "textContent": "No arrow"},
-{"id": "copyrightLabel", "textContent": "Powered by"},
+{"id": "connector_no_arrow", "textContent": "Geen pijl"},
+{"id": "copyrightLabel", "textContent": "Mogelijk gemaakt door"},
{"id": "cornerRadiusLabel", "title": "Verander hoekradius rechthoek"},
{"id": "curve_segments", "textContent": "Gebogen"},
{"id": "ellipse_cx", "title": "Verander het X coordinaat van het ellips middelpunt"},
@@ -23,6 +23,7 @@
{"id": "icon_medium", "textContent": "Gemiddeld"},
{"id": "icon_small", "textContent": "Klein"},
{"id": "icon_xlarge", "textContent": "Extra groot"},
+{"id": "idLabel", "title": "Identificeer het element"},
{"id": "image_height", "title": "Verander hoogte afbeelding"},
{"id": "image_opt_embed", "textContent": "Toevoegen data (lokale bestanden)"},
{"id": "image_opt_ref", "textContent": "Gebruik bestand referentie"},
@@ -40,14 +41,14 @@
{"id": "line_x2", "title": "Verander eind X coordinaat van de lijn"},
{"id": "line_y1", "title": "Verander start Y coordinaat van de lijn"},
{"id": "line_y2", "title": "Verander eind Y coordinaat van de lijn"},
-{"id": "linecap_butt", "title": "Linecap: Butt"},
-{"id": "linecap_round", "title": "Linecap: Round"},
-{"id": "linecap_square", "title": "Linecap: Square"},
-{"id": "linejoin_bevel", "title": "Linejoin: Bevel"},
-{"id": "linejoin_miter", "title": "Linejoin: Miter"},
-{"id": "linejoin_round", "title": "Linejoin: Round"},
-{"id": "main_icon", "title": "Main Menu"},
-{"id": "mode_connect", "title": "Connect two objects"},
+{"id": "linecap_butt", "title": "Lijneinde: Geen"},
+{"id": "linecap_round", "title": "Lijneinde: Rond"},
+{"id": "linecap_square", "title": "Lijneinde: Vierkant"},
+{"id": "linejoin_bevel", "title": "Lijnverbinding: Afgestompt"},
+{"id": "linejoin_miter", "title": "Lijnverbinding: Hoek"},
+{"id": "linejoin_round", "title": "Lijnverbinding: Rond"},
+{"id": "main_icon", "title": "Hoofdmenu"},
+{"id": "mode_connect", "title": "Verbind twee objecten"},
{"id": "page", "textContent": "Pagina"},
{"id": "palette", "title": "Klik om de vul kleur te veranderen, shift-klik om de lijn kleur te veranderen"},
{"id": "path_node_x", "title": "Verander X coordinaat knooppunt"},
@@ -78,8 +79,8 @@
{"id": "svginfo_title", "textContent": "Titel"},
{"id": "svginfo_width", "textContent": "Breedte:"},
{"id": "text", "title": "Wijzig tekst"},
-{"id": "toggle_stroke_tools", "title": "Show/hide more stroke tools"},
-{"id": "tool_add_subpath", "title": "Add sub-path"},
+{"id": "toggle_stroke_tools", "title": "Toon/verberg meer lijn gereedschap"},
+{"id": "tool_add_subpath", "title": "Subpad toevoegen"},
{"id": "tool_alignbottom", "title": "Onder uitlijnen"},
{"id": "tool_aligncenter", "title": "Centreren"},
{"id": "tool_alignleft", "title": "Links uitlijnen"},
@@ -87,7 +88,7 @@
{"id": "tool_alignright", "title": "Rechts uitlijnen"},
{"id": "tool_aligntop", "title": "Boven uitlijnen"},
{"id": "tool_angle", "title": "Draai"},
-{"id": "tool_blur", "title": "Change gaussian blur value"},
+{"id": "tool_blur", "title": "Verander Gaussische vervaging waarde"},
{"id": "tool_bold", "title": "Vet"},
{"id": "tool_circle", "title": "Cirkel"},
{"id": "tool_clear", "textContent": "Nieuwe afbeelding"},
@@ -99,15 +100,15 @@
{"id": "tool_docprops_cancel", "textContent": "Annuleren"},
{"id": "tool_docprops_save", "textContent": "Ok"},
{"id": "tool_ellipse", "title": "Ellips"},
-{"id": "tool_export", "textContent": "Export as PNG"},
-{"id": "tool_eyedropper", "title": "Eye Dropper Tool"},
+{"id": "tool_export", "textContent": "Exporteer als PNG"},
+{"id": "tool_eyedropper", "title": "Kleuren kopieer gereedschap"},
{"id": "tool_fhellipse", "title": "Vrije stijl ellips"},
{"id": "tool_fhpath", "title": "Potlood"},
{"id": "tool_fhrect", "title": "Vrije stijl rechthoek"},
{"id": "tool_font_size", "title": "Verander lettertype grootte"},
{"id": "tool_group", "title": "Groepeer elementen"},
{"id": "tool_image", "title": "Afbeelding"},
-{"id": "tool_import", "textContent": "Import SVG"},
+{"id": "tool_import", "textContent": "Importeer SVG"},
{"id": "tool_italic", "title": "Cursief"},
{"id": "tool_line", "title": "Lijn"},
{"id": "tool_move_bottom", "title": "Naar achtergrond"},
@@ -117,7 +118,9 @@
{"id": "tool_node_link", "title": "Koppel controle punten"},
{"id": "tool_opacity", "title": "Verander opaciteit geselecteerde item"},
{"id": "tool_open", "textContent": "Open afbeelding"},
+{"id": "tool_openclose_path", "title": "Open/sluit subpad"},
{"id": "tool_path", "title": "Pad"},
+{"id": "tool_position", "title": "Lijn element uit relatief ten opzichte van de pagina"},
{"id": "tool_rect", "title": "Rechthoek"},
{"id": "tool_redo", "title": "Opnieuw doen"},
{"id": "tool_reorient", "title": "Herorienteer pad"},
@@ -133,7 +136,7 @@
{"id": "tool_ungroup", "title": "Groepering opheffen"},
{"id": "tool_wireframe", "title": "Draadmodel"},
{"id": "tool_zoom", "title": "Zoom"},
-{"id": "url_notice", "title": "NOTE: This image cannot be embedded. It will depend on this path to be displayed"},
+{"id": "url_notice", "title": "Let op: Dit plaatje kan niet worden geintegreerd (embeded). Het hangt af van dit pad om te worden afgebeeld."},
{"id": "zoom_panel", "title": "In-/uitzoomen"},
{"id": "sidepanel_handle", "textContent": "L a g e n", "title": "Sleep naar links/rechts om het zijpaneel te vergroten/verkleinen"},
{
@@ -143,16 +146,16 @@
"QmoveElemsToLayer": "Verplaats geselecteerde elementen naar laag '%s'?",
"QwantToClear": "Wil je de afbeelding leeg maken?\nDit zal ook de ongedaan maak geschiedenis wissen!",
"cancel": "Annuleren",
- "defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
+ "defsFailOnSave": "Let op: Vanwege een fout in je browser, kan dit plaatje verkeerd verschijnen (missende hoeken en/of elementen). Het zal goed verschijnen zodra het plaatje echt wordt opgeslagen.",
"dupeLayerName": "Er is al een laag met die naam!",
"enterNewImgURL": "Geef de nieuwe afbeelding URL",
"enterNewLayerName": "Geef een nieuwe laag naam",
"enterUniqueLayerName": "Geef een unieke laag naam",
- "exportNoBlur": "Blurred elements will appear as un-blurred",
- "exportNoDashArray": "Strokes will appear filled",
- "exportNoImage": "Image elements will not appear",
- "exportNoText": "Text may not appear as expected",
- "exportNoforeignObject": "foreignObject elements will not appear",
+ "exportNoBlur": "Vervaagde elementen zullen niet vervaagd worden geexporteerd.",
+ "exportNoDashArray": "Lijnstijlen zullen gevuld worden geexporteerd..",
+ "exportNoImage": "Plaatjes elementen zullen niet worden geexporteerd.",
+ "exportNoText": "Tekst kan mogelijk niet zo worden geexporteerd zoals verwacht.",
+ "exportNoforeignObject": "Vreemde objecten zullen niet worden geexporteerd.",
"featNotSupported": "Functie wordt niet ondersteund",
"invalidAttrValGiven": "Verkeerde waarde gegeven",
"key_backspace": "backspace",
@@ -161,13 +164,13 @@
"key_up": "omhoog",
"layer": "Laag",
"layerHasThatName": "Laag heeft al die naam",
- "loadingImage": "Loading image, please wait...",
+ "loadingImage": "Laden van het plaatje, even geduld aub...",
"noContentToFitTo": "Geen inhoud om omheen te passen",
- "noteTheseIssues": "Also note the following issues: ",
+ "noteTheseIssues": "Let op de volgende problemen: ",
"ok": "Ok",
"pathCtrlPtTooltip": "Versleep het controle punt om de boog eigenschappen te veranderen",
"pathNodeTooltip": "Versleep knooppunt om hem te verslepen. Dubbel klik knooppunt om het segment type te veranderen",
- "saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file."
+ "saveFromBrowser": "Kies \"Save As...\" in je browser om dit plaatje op te slaan als een %s bestand."
}
}
]
\ No newline at end of file
diff --git a/public/svg-edit/editor/svg-editor.js b/public/svg-edit/editor/svg-editor.js
index f6f9c568..601ea303 100644
--- a/public/svg-edit/editor/svg-editor.js
+++ b/public/svg-edit/editor/svg-editor.js
@@ -246,7 +246,9 @@
'zoom':'zoom.png',
'clone':'clone.png',
+ 'node_clone':'node_clone.png',
'delete':'delete.png',
+ 'node_delete':'node_delete.png',
'group':'shape_group.png',
'ungroup':'shape_ungroup.png',
'move_top':'move_top.png',
@@ -300,8 +302,10 @@
'#tool_image':'image',
'#tool_zoom':'zoom',
- '#tool_clone,#tool_clone_multi,#tool_node_clone':'clone',
- '#layer_delete,#tool_delete,#tool_delete_multi,#tool_node_delete':'delete',
+ '#tool_clone,#tool_clone_multi':'clone',
+ '#tool_node_clone':'node_clone',
+ '#layer_delete,#tool_delete,#tool_delete_multi':'delete',
+ '#tool_node_delete':'node_delete',
'#tool_add_subpath':'add_subpath',
'#tool_openclose_path':'open_path',
'#tool_move_top':'move_top',
@@ -1823,15 +1827,6 @@
*/
- // var setIcon = function(holder_sel, id) {
- // var icon = $.getSvgIcon(id).clone();
- // var holder = $(holder_sel);
- // icon[0].setAttribute('width',holder.width());
- // icon[0].setAttribute('height',holder.height());
- // holder.empty().append(icon)
- // .attr('data-curopt', holder_sel.replace('_show','')); // This sets the current mode
- // }
-
// Unfocus text input when workarea is mousedowned.
(function() {
var inp;
@@ -2296,7 +2291,7 @@
var icon = $.getSvgIcon(icon_id).clone();
$(elem).empty().append(icon);
var size = curPrefs.iconsize;
- if(size !== 'm') {
+ if(size && size !== 'm') {
var icon_sizes = { s:16, m:24, l:32, xl:48}, obj = {};
obj[elem + ' .svg_icon'] = icon_sizes[size];
$.resizeSvgIcons(obj);
@@ -3464,7 +3459,7 @@
updateCanvas(true);
// });
- // var revnums = "svg-editor.js ($Rev: 1569 $) ";
+ // var revnums = "svg-editor.js ($Rev: 1574 $) ";
// revnums += svgCanvas.getVersion();
// $('#copyright')[0].setAttribute("title", revnums);
diff --git a/public/svg-edit/editor/svgcanvas.js b/public/svg-edit/editor/svgcanvas.js
index 806d52d1..d46357da 100644
--- a/public/svg-edit/editor/svgcanvas.js
+++ b/public/svg-edit/editor/svgcanvas.js
@@ -961,7 +961,6 @@ function BatchCommand(text) {
'').documentElement, true);
$(svgroot).appendTo(container);
-
var opac_ani = document.createElementNS(svgns, 'animate');
$(opac_ani).attr({
attributeName: 'opacity',
@@ -1777,7 +1776,9 @@ function BatchCommand(text) {
var i = selectedElements.length;
while(i--) {
- var cmd = recalculateDimensions(selectedElements[i]);
+ var elem = selectedElements[i];
+// if(canvas.getRotationAngle(elem) && !hasMatrixTransform(canvas.getTransformList(elem))) continue;
+ var cmd = recalculateDimensions(elem);
if (cmd) {
batchCmd.addSubCommand(cmd);
}
@@ -2052,6 +2053,8 @@ function BatchCommand(text) {
}
}
}
+ // End here if all it has is a rotation
+ if(tlist.numberOfItems == 1 && canvas.getRotationAngle(selected)) return null;
}
// if this element had no transforms, we are done
@@ -2132,6 +2135,7 @@ function BatchCommand(text) {
transformListToTransform(tlist).matrix),
m = svgroot.createSVGMatrix();
+
// temporarily strip off the rotate and save the old center
var gangle = canvas.getRotationAngle(selected);
if (gangle) {
@@ -2157,7 +2161,11 @@ function BatchCommand(text) {
var tx = 0, ty = 0,
operation = 0,
N = tlist.numberOfItems;
-
+
+ if(N) {
+ var first_m = tlist.getItem(0).matrix;
+ }
+
// first, if it was a scale then the second-last transform will be it
if (N >= 3 && tlist.getItem(N-2).type == 3 &&
tlist.getItem(N-3).type == 2 && tlist.getItem(N-1).type == 2)
@@ -2359,6 +2367,11 @@ function BatchCommand(text) {
// if it was a translate, put back the rotate at the new center
if (operation == 2) {
if (gangle) {
+ newcenter = {
+ x: oldcenter.x + first_m.e,
+ y: oldcenter.y + first_m.f
+ };
+
var newRot = svgroot.createSVGTransform();
newRot.setRotate(gangle,newcenter.x,newcenter.y);
tlist.insertItemBefore(newRot, 0);
@@ -2550,8 +2563,12 @@ function BatchCommand(text) {
// if it was a translate, put back the rotate at the new center
if (operation == 2) {
if (angle) {
+ newcenter = {
+ x: oldcenter.x + m.e,
+ y: oldcenter.y + m.f
+ };
var newRot = svgroot.createSVGTransform();
- newRot.setRotate(angle,newcenter.x,newcenter.y);
+ newRot.setRotate(angle, newcenter.x, newcenter.y);
tlist.insertItemBefore(newRot, 0);
}
}
@@ -3447,50 +3464,15 @@ function BatchCommand(text) {
var y2 = y;
if(evt.shiftKey) {
+ var snap = Math.PI/4; // 45 degrees
var diff_x = x - start_x;
var diff_y = y - start_y;
-
- var angle = ((Math.atan2(start_y-y,start_x-x) * (180/Math.PI))-90) % 360;
- angle = angle<0?(360+angle):angle
-
- // TODO: Write all this more efficiently
+ var angle = Math.atan2(diff_y,diff_x);
var dist = Math.sqrt(diff_x * diff_x + diff_y * diff_y);
- var val = Math.sqrt((dist*dist)/2);
- var diagonal = false;
-
- if(angle >= 360-22.5 || angle < 22.5) {
- x2 = start_x;
- } else if(angle >= 22.5 && angle < 22.5 + 45) {
- diagonal = true;
- } else if(angle >= 22.5 + 45 && angle < 22.5 + 90) {
- y2 = start_y;
- } else if(angle >= 22.5 + 90 && angle < 22.5 + 135) {
- diagonal = true;
- } else if(angle >= 22.5 + 135 && angle < 22.5 + 180) {
- x2 = start_x;
- } else if(angle >= 22.5 + 180 && angle < 22.5 + 225) {
- diagonal = true;
- } else if(angle >= 22.5 + 225 && angle < 22.5 + 270) {
- y2 = start_y;
- } else if(angle >= 22.5 + 270 && angle < 22.5 + 315) {
- diagonal = true;
- }
-
- if(diagonal) {
- if(y2 < start_y) {
- y2 = start_y - val;
- } else {
- y2 = start_y + val;
- }
-
- if(x2 < start_x) {
- x2 = start_x - val;
- } else {
- x2 = start_x + val;
- }
- }
+ var snapangle= Math.round(angle/snap)*snap;
+ x2 = start_x + dist*Math.cos(snapangle);
+ y2 = start_y + dist*Math.sin(snapangle);
}
-
shape.setAttributeNS(null, "x2", x2);
shape.setAttributeNS(null, "y2", y2);
@@ -4831,16 +4813,36 @@ function BatchCommand(text) {
this.addSeg = function(index) {
// Adds a new segment
var seg = p.segs[index];
-
if(!seg.prev) return;
var prev = seg.prev;
-
- var new_x = (seg.item.x + prev.item.x) / 2;
- var new_y = (seg.item.y + prev.item.y) / 2;
-
- var list = elem.pathSegList;
- var newseg = elem.createSVGPathSegLinetoAbs(new_x, new_y);
+ var newseg;
+ switch(seg.item.pathSegType) {
+ case 4:
+ var new_x = (seg.item.x + prev.item.x) / 2;
+ var new_y = (seg.item.y + prev.item.y) / 2;
+ newseg = elem.createSVGPathSegLinetoAbs(new_x, new_y);
+ break;
+ case 6: //make it a curved segment to preserve the shape (WRS)
+ // http://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm#Geometric_interpretation
+ var p0_x = (prev.item.x + seg.item.x1)/2;
+ var p1_x = (seg.item.x1 + seg.item.x2)/2;
+ var p2_x = (seg.item.x2 + seg.item.x)/2;
+ var p01_x = (p0_x + p1_x)/2;
+ var p12_x = (p1_x + p2_x)/2;
+ var new_x = (p01_x + p12_x)/2;
+ var p0_y = (prev.item.y + seg.item.y1)/2;
+ var p1_y = (seg.item.y1 + seg.item.y2)/2;
+ var p2_y = (seg.item.y2 + seg.item.y)/2;
+ var p01_y = (p0_y + p1_y)/2;
+ var p12_y = (p1_y + p2_y)/2;
+ var new_y = (p01_y + p12_y)/2;
+ newseg = elem.createSVGPathSegCurvetoCubicAbs(new_x,new_y, p0_x,p0_y, p01_x,p01_y);
+ var pts = [seg.item.x,seg.item.y,p12_x,p12_y,p2_x,p2_y];
+ replacePathSeg(seg.type,index,pts);
+ break;
+ }
+
insertItemBefore(elem, newseg, index);
}
@@ -5030,10 +5032,17 @@ function BatchCommand(text) {
var diff_x = cur_x - prev_x;
var diff_y = cur_y - prev_y;
// get control points from straight line segment
+ /*
var ct1_x = (prev_x + (diff_y/2));
var ct1_y = (prev_y - (diff_x/2));
var ct2_x = (cur_x + (diff_y/2));
var ct2_y = (cur_y - (diff_x/2));
+ */
+ //create control points on the line to preserve the shape (WRS)
+ var ct1_x = (prev_x + (diff_x/3));
+ var ct1_y = (prev_y + (diff_y/3));
+ var ct2_x = (cur_x - (diff_x/3));
+ var ct2_y = (cur_y - (diff_y/3));
points = [cur_x,cur_y, ct1_x,ct1_y, ct2_x,ct2_y];
}
break;
@@ -9038,7 +9047,7 @@ function BatchCommand(text) {
// Function: getVersion
// Returns a string which describes the revision number of SvgCanvas.
this.getVersion = function() {
- return "svgcanvas.js ($Rev: 1569 $)";
+ return "svgcanvas.js ($Rev: 1573 $)";
};
this.setUiStrings = function(strs) {
diff --git a/vendor/plugins/maruku/lib/maruku/output/to_html.rb b/vendor/plugins/maruku/lib/maruku/output/to_html.rb
index 889e592c..fb9b9a9c 100644
--- a/vendor/plugins/maruku/lib/maruku/output/to_html.rb
+++ b/vendor/plugins/maruku/lib/maruku/output/to_html.rb
@@ -410,7 +410,9 @@ It is copied as a standard HTML attribute.
[['pre'], attrs],
[['q', 'blockquote'], attrs+[:cite]],
[['ins','del'], attrs+[:cite,:datetime]],
- [['ol','ul','li'], attrs],
+ [['ol'], attrs+[:reversed, :start]],
+ [['ul'], attrs],
+ [['li'], attrs+[:value]],
['table',attrs+[:summary, :width, :frame, :rules, :border, :cellspacing, :cellpadding]],
['caption',attrs],
[['colgroup','col'],attrs+[:span, :width]+cellhalign+cellvalign],