setCustomhandlers

Further whittling away at differences between
Instiki's and the main branch of SVG-Edit.
Now, the saveHandler is set from within the calling
page.

If the editor was opened from Instiki, choosing "Save Image"
now closes the editor window. To leave it open was kinda confusing.

Also sync with latest SVG-Edit changes.
This commit is contained in:
Jacques Distler 2010-02-17 14:28:00 -06:00
parent 4475f02586
commit ea581a50ae
6 changed files with 78 additions and 24 deletions

View file

@ -85,8 +85,23 @@ function setupSVGedit(path){
var editor = window.open(path, 'Edit SVG graphic', 'status=1,resizable=1,scrollbars=1'); var editor = window.open(path, 'Edit SVG graphic', 'status=1,resizable=1,scrollbars=1');
if (selected) { if (selected) {
editor.addEventListener("load", function() { editor.addEventListener("load", function() {
editor.svgCanvas.setCustomHandlers({
'save': function(window,svg){
window.opener.postMessage(svg, window.location.protocol + '//' + window.location.host);
window.close();
}
});
editor.svgCanvas.setSvgString(selected); editor.svgCanvas.setSvgString(selected);
}, true); }, true);
} else {
editor.addEventListener("load", function() {
editor.svgCanvas.setCustomHandlers({
'save': function(window,svg){
window.opener.postMessage(svg, window.location.protocol + '//' + window.location.host);
window.close();
}
});
}, true);
} }
SVGeditButton.disabled = true; SVGeditButton.disabled = true;
SVGeditButton.value = 'Create SVG graphic'; SVGeditButton.value = 'Create SVG graphic';

View file

@ -1,4 +1,4 @@
body { body {
background: #D8D8D8; background: #D8D8D8;
} }
@ -734,6 +734,7 @@ span.zoom_tool {
#tool_docprops_back { #tool_docprops_back {
margin-left: 1em; margin-left: 1em;
overflow: auto;
} }
#svg_docprops_container #svg_docprops_docprops, #svg_docprops_container #svg_docprops_docprops,

View file

@ -312,7 +312,10 @@ script type="text/javascript" src="locale/locale.min.js"></script-->
</div> </div>
<div class="toolset" id="tool_font_family"> <div class="toolset" id="tool_font_family">
<label>
<!-- Font family -->
<input id="font_family" type="text" title="Change Font Family" size="12"/> <input id="font_family" type="text" title="Change Font Family" size="12"/>
</label>
<div id="font_family_dropdown" class="dropdown"> <div id="font_family_dropdown" class="dropdown">
<button></button> <button></button>
<ul> <ul>
@ -329,7 +332,10 @@ script type="text/javascript" src="locale/locale.min.js"></script-->
<span id="font_sizeLabel">size:</span> <span id="font_sizeLabel">size:</span>
<input id="font_size" title="Change Font Size" size="3" value="0" type="text"/> <input id="font_size" title="Change Font Size" size="3" value="0" type="text"/>
</label> </label>
<label>
<!-- Text content -->
<input id="text" type="text" title="Change text contents" size="35"/> <input id="text" type="text" title="Change text contents" size="35"/>
</label>
</div> </div>
<div id="path_node_panel"> <div id="path_node_panel">

View file

@ -171,9 +171,9 @@ function svg_edit_setup() {
var strokePaint = new $.jGraduate.Paint({solidColor: "000000"}); // solid black var strokePaint = new $.jGraduate.Paint({solidColor: "000000"}); // solid black
var saveHandler = function(window,svg) { var saveHandler = function(window,svg) {
// by default, we add the XML prolog back, systems integrating SVG-edit (wikis, CMSs)
window.opener.postMessage(svg, window.location.protocol + '//' + window.location.host); // can just provide their own custom save handler and might not want the XML prolog
return; svg = "<?xml version='1.0'?>\n" + svg;
// Creates and opens an HTML page that provides a link to the SVG, a preview, and the markup. // Creates and opens an HTML page that provides a link to the SVG, a preview, and the markup.
// Also includes warning about Mozilla bug #308590 when applicable // Also includes warning about Mozilla bug #308590 when applicable
@ -1738,7 +1738,7 @@ function svg_edit_setup() {
'margin-top': {s: '2px', l: '4px', xl: '5px'}, 'margin-top': {s: '2px', l: '4px', xl: '5px'},
'height': {s: 'auto', l: 'auto', xl: 'auto'}, 'height': {s: 'auto', l: 'auto', xl: 'auto'},
'border': {s: '1px solid #555', l: 'auto', xl: 'auto'}, 'border': {s: '1px solid #555', l: 'auto', xl: 'auto'},
'font-size': {s: '.9em', l: '2em', xl: '2.5em'} 'font-size': {s: '.9em', l: '1.2em', xl: '1.4em'}
}, },
"#zoom_panel": { "#zoom_panel": {
'margin-top': {s: '3px', l: '4px', xl: '5px'} 'margin-top': {s: '3px', l: '4px', xl: '5px'}
@ -1758,10 +1758,12 @@ function svg_edit_setup() {
'line-height': {s: '18px', l: '34px', xl: '40px'}, 'line-height': {s: '18px', l: '34px', xl: '40px'},
'margin-top': {s: '3px'} 'margin-top': {s: '3px'}
}, },
"div.toolset, #tools_top label, #tools_bottom label": { "#tools_top label, #tools_bottom label": {
'font-size': {s: '1em', l: '1.5em', xl: '2em'}, 'font-size': {s: '1em', l: '1.5em', xl: '2em'},
'margin-top': {s: '1px', l: '3px', xl: '5px'}, 'height': {s: '25px', l: '42px', xl: '64px'}
'height': {s: '25px', l: '43px', xl: '64px'} },
"div.toolset": {
'height': {s: '25px', l: '42px', xl: '64px'}
}, },
"#tool_bold, #tool_italic": { "#tool_bold, #tool_italic": {
'font-size': {s: '1.5em', l: '3em', xl: '4.5em'} 'font-size': {s: '1.5em', l: '3em', xl: '4.5em'}
@ -2761,7 +2763,7 @@ function svg_edit_setup() {
updateCanvas(true); updateCanvas(true);
}); });
// var revnums = "svg-editor.js ($Rev: 1395 $) "; // var revnums = "svg-editor.js ($Rev: 1402 $) ";
// revnums += svgCanvas.getVersion(); // revnums += svgCanvas.getVersion();
// $('#copyright')[0].setAttribute("title", revnums); // $('#copyright')[0].setAttribute("title", revnums);
return svgCanvas; return svgCanvas;

View file

@ -684,7 +684,9 @@ function BatchCommand(text) {
'fill': '#FFF', 'fill': '#FFF',
'style': 'pointer-events:none' 'style': 'pointer-events:none'
}); });
if (!window.opera) rect.setAttribute('filter', 'url(#canvashadow)'); // Both Firefox and WebKit are too slow with this filter region (especially at higher
// zoom levels) and Opera has at least one bug
// if (!window.opera) rect.setAttribute('filter', 'url(#canvashadow)');
canvasbg.appendChild(rect); canvasbg.appendChild(rect);
svgroot.insertBefore(canvasbg, svgcontent); svgroot.insertBefore(canvasbg, svgcontent);
}; };
@ -1343,7 +1345,7 @@ function BatchCommand(text) {
if(attrName.indexOf('se:') == 0) { if(attrName.indexOf('se:') == 0) {
se_attrs.push([attrName, attr.nodeValue]); se_attrs.push([attrName, attr.nodeValue]);
} }
node.removeAttribute(attrName); node.removeAttributeNS(attrNsURI, attrLocalName);
} }
// special handling for path d attribute // special handling for path d attribute
if (node.nodeName == 'path' && attrName == 'd') { if (node.nodeName == 'path' && attrName == 'd') {
@ -1528,7 +1530,7 @@ function BatchCommand(text) {
var i = attrs.length; var i = attrs.length;
while (i--) { while (i--) {
attr = attrs.item(i); attr = attrs.item(i);
var attrVal = attr.nodeValue; var attrVal = toXml(attr.nodeValue);
// only serialize attributes we don't use internally // only serialize attributes we don't use internally
if (attrVal != "" && if (attrVal != "" &&
$.inArray(attr.localName, ['width','height','xmlns','x','y','viewBox','id','overflow']) == -1) $.inArray(attr.localName, ['width','height','xmlns','x','y','viewBox','id','overflow']) == -1)
@ -1542,7 +1544,7 @@ function BatchCommand(text) {
} else { } else {
for (var i=attrs.length-1; i>=0; i--) { for (var i=attrs.length-1; i>=0; i--) {
attr = attrs.item(i); attr = attrs.item(i);
var attrVal = attr.nodeValue; var attrVal = toXml(attr.nodeValue);
if (attr.localName == '-moz-math-font-style') continue; if (attr.localName == '-moz-math-font-style') continue;
if (attrVal != "") { if (attrVal != "") {
if(attrVal.indexOf('pointer-events') == 0) continue; if(attrVal.indexOf('pointer-events') == 0) continue;
@ -7721,7 +7723,7 @@ function BatchCommand(text) {
// Function: getVersion // Function: getVersion
// Returns a string which describes the revision number of SvgCanvas. // Returns a string which describes the revision number of SvgCanvas.
this.getVersion = function() { this.getVersion = function() {
return "svgcanvas.js ($Rev: 1396 $)"; return "svgcanvas.js ($Rev: 1404 $)";
}; };
this.setUiStrings = function(strs) { this.setUiStrings = function(strs) {

View file

@ -1,7 +1,7 @@
<html> <html>
<head> <head>
<link rel="stylesheet" href="qunit/qunit.css" type="text/css"/> <link rel="stylesheet" href="qunit/qunit.css" type="text/css"/>
<script src="../editor/jquery.js"> </script> <script src="../editor/jquery.js"></script>
<script type="text/javascript" src="../editor/svgicons/jquery.svgicons.js"></script> <script type="text/javascript" src="../editor/svgicons/jquery.svgicons.js"></script>
<script type="text/javascript" src="../editor/locale/locale.js"></script> <script type="text/javascript" src="../editor/locale/locale.js"></script>
<script type="text/javascript" src="../editor/svgcanvas.js"></script> <script type="text/javascript" src="../editor/svgcanvas.js"></script>
@ -172,22 +172,50 @@
'</svg>'); '</svg>');
var attrVal = document.getElementById('se_test_elem').getAttributeNS("http://svg-edit.googlecode.com", "foo"); var attrVal = document.getElementById('se_test_elem').getAttributeNS("http://svg-edit.googlecode.com", "foo");
equals(true, attrVal === "bar", "Preserved namespaced attribute on import"); equals(attrVal === "bar", true, "Preserved namespaced attribute on import");
var output = svgCanvas.getSvgString(); var output = svgCanvas.getSvgString();
var has_xlink = output.indexOf('xmlns:xlink="http://www.w3.org/1999/xlink"') !== -1; var has_xlink = output.indexOf('xmlns:xlink="http://www.w3.org/1999/xlink"') !== -1;
var has_se = output.indexOf('xmlns:se=') !== -1; var has_se = output.indexOf('xmlns:se=') !== -1;
var has_foo = output.indexOf('xmlns:foo=') === -1; var has_foo = output.indexOf('xmlns:foo=') !== -1;
var has_attr = output.indexOf('se:foo="bar"') !== -1; var has_attr = output.indexOf('se:foo="bar"') !== -1;
equals(true, has_attr, "Preserved namespaced attribute on export"); equals(has_attr, true, "Preserved namespaced attribute on export");
equals(true, has_xlink, "Included xlink: xmlns"); equals(has_xlink, true, "Included xlink: xmlns");
equals(true, has_se, "Included se: xmlns"); equals(has_se, true, "Included se: xmlns");
equals(true, has_foo, "Did not include foo: xmlns"); equals(has_foo, false, "Did not include foo: xmlns");
}); });
test("Test import math elements inside a foreignObject", function() {
expect(4);
var set = svgCanvas.setSvgString('<svg width="640" height="480" xmlns="http://www.w3.org/2000/svg" xmlns:se="http://svg-edit.googlecode.com" xmlns:xlink="http://www.w3.org/1999/xlink">'+
'<foreignObject id="fo" width="24" height="26" font-size="24"><math id="m" display="inline" xmlns="http://www.w3.org/1998/Math/MathML">'+
'<msub>'+
'<mi>A</mi>'+
'<mn>0</mn>'+
'</msub>'+
'</math>'+
'</foreignObject>'+
'</svg>');
var fo = document.getElementById('fo');
// we cannot use getElementById('math') because not all browsers understand MathML and do not know to use the @id attribute
// see Bug https://bugs.webkit.org/show_bug.cgi?id=35042
var math = fo.firstChild;
equals(!!math, true, "Math element exists");
equals(math.nodeName, 'math', "Math element has the proper nodeName");
equals(math.getAttribute('id'), 'm', "Math element has an id");
equals(math.namespaceURI, "http://www.w3.org/1998/Math/MathML", "Preserved MathML namespace");
});
test("Test XML entities in attribute", function() {
expect(3);
equals(svgCanvas.getPrivateMethods().toXml("<"), "&lt;", "Escaped < properly");
equals(svgCanvas.getPrivateMethods().toXml(">"), "&gt;", "Escaped > properly");
equals(svgCanvas.getPrivateMethods().toXml("&"), "&amp;", "Escaped & properly");
// TODO: what about &quot; and &apos; ?
});
}); });
</script> </script>
</head> </head>