Updated Sanitizer for HTML5

Sanitizer should recognize HTML elements
and attributes.

New Allowed Elements:

  article aside audio canvas command details
  dialog figcaption figure footer header
  hgroup mark meter nav progress rp rt ruby
  section source summary time video war 
       
(OK, audio and video were already there)

New Allowed Attributes:

  autocomplete contenteditable contextmenu
  draggable formaction icon low max min
  open optimum pattern placeholder preload
  pubdate required reversed  spellcheck step
  wrap

Attributes removed:

  abbr charset loopcount loopend loopstart
  noshade nowrap rev rules 


Maruku supports @start and @reversed on
ordered lists. It doesn't seem to support
IALs on li elements, so you still can't
attach @value to an li.
This commit is contained in:
Jacques Distler 2010-05-22 14:34:08 -05:00
parent d9d353a350
commit 2781890832
9 changed files with 175 additions and 137 deletions

View file

@ -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]

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

View file

@ -946,6 +946,30 @@
</svg>
</g>
<g id="node_delete">
<svg width="24" height="24" xmlns="http://www.w3.org/2000/svg">
<path stroke-width="2" id="svg_102" d="m4.1953,19.42128c15.49391,-15.53349 -0.21065,0.1581 15.61084,-15.57944" stroke="#8dd35f" fill="none"/>
<circle stroke-width="0.5" id="svg_121" stroke="#0000ff" fill="#00ffff" r="2.26172" cy="4" cx="19.75"/>
<circle id="svg_123" stroke-width="0.5" stroke="#0000ff" fill="#00ffff" r="2.26172" cy="19.40299" cx="4.0653"/>
<circle id="svg_7" stroke-width="0.5" stroke="#0000ff" fill="#00ffff" r="2.26172" cy="11.625" cx="11.9375"/>
<g transform="rotate(-45.291072845458984 9.81157112121582,9.244086265563965) " id="svg_6">
<line stroke-linecap="round" id="svg_4" y2="9.45264" x2="15.14996" y1="9.3943" x1="4.47318" stroke-dasharray="null" stroke-width="2" stroke="#ff0000" fill="none"/>
<line stroke-linecap="round" id="svg_5" y2="14.46579" x2="9.66571" y1="4.02238" x1="9.7824" stroke-dasharray="null" stroke-width="2" stroke="#ff0000" fill="none"/>
</g>
</svg>
</g>
<g id="node_clone">
<svg width="24" height="24" xmlns="http://www.w3.org/2000/svg">
<path stroke-width="2" id="svg_102" d="m4.1953,19.42128c15.49391,-15.53349 -0.21065,0.1581 15.61084,-15.57944" stroke="#8dd35f" fill="none"/>
<circle stroke-width="0.5" id="svg_121" stroke="#0000ff" fill="#00ffff" r="2.26172" cy="4" cx="19.75"/>
<circle id="svg_123" stroke-width="0.5" stroke="#0000ff" fill="#00ffff" r="2.26172" cy="19.40299" cx="4.0653"/>
<circle id="svg_7" stroke-width="0.5" stroke="#0000ff" fill="#00ffff" r="2.26172" cy="11.625" cx="11.9375"/>
<line stroke-linecap="round" id="svg_5" y2="14.46579" x2="9.66571" y1="4.02238" x1="9.7824" stroke-dasharray="null" stroke-width="2" stroke="#0000ff" fill="#0000ff"/>
<line stroke-linecap="round" id="svg_4" y2="9.45264" x2="15.14996" y1="9.3943" x1="4.47318" stroke-dasharray="null" stroke-width="2" stroke="#0000ff" fill="#0000ff"/>
</svg>
</g>
<g id="svg_eof"/>
</svg>
</svg>

View file

@ -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."
}
}
]

View file

@ -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."
}
}
]

View file

@ -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);

View file

@ -961,7 +961,6 @@ function BatchCommand(text) {
'</svg>').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) {

View file

@ -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],