2014-02-12 09:38:38 +00:00
/*globals svgEditor, svgedit, svgCanvas, canvg, $*/
/*jslint eqeq: true*/
2010-07-01 20:14:12 +00:00
/ *
2010-07-06 13:57:05 +00:00
* ext - server _opensave . js
2010-07-01 20:14:12 +00:00
*
2012-09-16 18:53:27 +00:00
* Licensed under the MIT License
2010-07-01 20:14:12 +00:00
*
* Copyright ( c ) 2010 Alexis Deveria
*
* /
2010-07-06 13:57:05 +00:00
svgEditor . addExtension ( "server_opensave" , {
2010-07-01 20:14:12 +00:00
callback : function ( ) {
2013-10-29 06:54:31 +00:00
'use strict' ;
function getFileNameFromTitle ( ) {
var title = svgCanvas . getDocumentTitle ( ) ;
2014-02-01 16:13:51 +00:00
// We convert (to underscore) only those disallowed Win7 file name characters
return $ . trim ( title ) . replace ( /[\/\\:*?"<>|]/g , '_' ) ;
}
function xhtmlEscape ( str ) {
2014-02-01 17:00:36 +00:00
return str . replace ( /&(?!amp;)/g , '&' ) . replace ( /"/g , '"' ) . replace ( /</g , '<' ) ; // < is actually disallowed above anyways
2013-10-29 06:54:31 +00:00
}
function clientDownloadSupport ( filename , suffix , uri ) {
var a ,
support = $ ( '<a>' ) [ 0 ] . download === '' ;
if ( support ) {
a = $ ( '<a>hidden</a>' ) . attr ( { download : ( filename || 'image' ) + suffix , href : uri } ) . css ( 'display' , 'none' ) . appendTo ( 'body' ) ;
a [ 0 ] . click ( ) ;
return true ;
}
}
2013-10-29 01:26:23 +00:00
var open _svg _action , import _svg _action , import _img _action ,
2013-10-29 06:54:31 +00:00
open _svg _form , import _svg _form , import _img _form ,
2014-02-12 03:48:48 +00:00
save _svg _action = svgEditor . curConfig . extPath + 'filesave.php' ,
save _img _action = svgEditor . curConfig . extPath + 'filesave.php' ,
2013-10-29 06:54:31 +00:00
// Create upload target (hidden iframe)
2014-05-22 10:21:29 +00:00
cancelled = false ,
Utils = svgedit . utilities ;
2010-07-06 13:57:05 +00:00
2013-10-29 06:54:31 +00:00
$ ( '<iframe name="output_frame" src="#"/>' ) . hide ( ) . appendTo ( 'body' ) ;
2010-07-06 13:57:05 +00:00
svgEditor . setCustomHandlers ( {
save : function ( win , data ) {
2014-02-02 01:06:25 +00:00
var svg = '<?xml version="1.0" encoding="UTF-8"?>\n' + data , // Firefox doesn't seem to know it is UTF-8 (no matter whether we use or skip the clientDownload code) despite the Content-Disposition header containing UTF-8, but adding the encoding works
2013-10-29 06:54:31 +00:00
filename = getFileNameFromTitle ( ) ;
2013-10-29 01:26:23 +00:00
2014-05-22 10:21:29 +00:00
if ( clientDownloadSupport ( filename , '.svg' , 'data:image/svg+xml;charset=UTF-8;base64,' + Utils . encode64 ( svg ) ) ) {
2013-10-29 06:54:31 +00:00
return ;
}
2014-02-01 16:13:51 +00:00
2013-10-29 01:26:23 +00:00
$ ( '<form>' ) . attr ( {
2010-07-06 13:57:05 +00:00
method : 'post' ,
action : save _svg _action ,
target : 'output_frame'
2014-02-01 16:13:51 +00:00
} ) . append ( '<input type="hidden" name="output_svg" value="' + xhtmlEscape ( svg ) + '">' )
. append ( '<input type="hidden" name="filename" value="' + xhtmlEscape ( filename ) + '">' )
2010-07-06 13:57:05 +00:00
. appendTo ( 'body' )
. submit ( ) . remove ( ) ;
} ,
2014-05-22 11:03:53 +00:00
// Todo: Add exportPDF!
2014-05-22 11:24:18 +00:00
// Todo: Integrate this extension with a new built-in exportWindowType, "download"
Support PNG, JPEG, BMP, WEBP export formats by change of "Export to PNG" menu item into "Export" with its own pull-down dialog (and a HTML5 range type input element for "quality" selection for JPEG or WEBP files), including changes for the server_opensave extension; change locale key from "export_png" to "export_img" and change the corresponding localized strings (currently CS, DE, ES, FR, IT, NL, PT-BR, RO, SK, all reset to English to avoid translation errors); within the setCustomHandlers() API, deprecate "pngsave" in favor of "exportImage" (chosen to avoid just using the simpler but reserved JS keyword "export") including use within the server_opensave extension; a few JSLint-friendly changes
git-svn-id: http://svg-edit.googlecode.com/svn/trunk@2602 eee81c28-f429-11dd-99c0-75d572ba1ddd
2013-10-28 03:53:30 +00:00
exportImage : function ( win , data ) {
2013-10-29 01:26:23 +00:00
var c ,
2013-10-29 06:54:31 +00:00
issues = data . issues ,
mimeType = data . mimeType ,
quality = data . quality ;
2010-07-06 13:57:05 +00:00
if ( ! $ ( '#export_canvas' ) . length ) {
$ ( '<canvas>' , { id : 'export_canvas' } ) . hide ( ) . appendTo ( 'body' ) ;
}
2013-10-29 01:26:23 +00:00
c = $ ( '#export_canvas' ) [ 0 ] ;
2010-07-06 13:57:05 +00:00
c . width = svgCanvas . contentW ;
c . height = svgCanvas . contentH ;
2014-05-22 10:21:29 +00:00
Utils . buildCanvgCallback ( function ( ) {
2014-05-22 02:56:00 +00:00
canvg ( c , data . svg , { renderCallback : function ( ) {
var pre , filename , suffix ,
datauri = quality ? c . toDataURL ( mimeType , quality ) : c . toDataURL ( mimeType ) ,
// uiStrings = svgEditor.uiStrings,
note = '' ;
// Check if there are issues
if ( issues . length ) {
pre = "\n \u2022 " ;
note += ( "\n\n" + pre + issues . join ( pre ) ) ;
}
if ( note . length ) {
alert ( note ) ;
}
filename = getFileNameFromTitle ( ) ;
suffix = '.' + data . type . toLowerCase ( ) ;
if ( clientDownloadSupport ( filename , suffix , datauri ) ) {
return ;
}
2013-10-29 01:26:23 +00:00
2014-05-22 02:56:00 +00:00
$ ( '<form>' ) . attr ( {
method : 'post' ,
action : save _img _action ,
target : 'output_frame'
} ) . append ( '<input type="hidden" name="output_img" value="' + datauri + '">' )
. append ( '<input type="hidden" name="mime" value="' + mimeType + '">' )
. append ( '<input type="hidden" name="filename" value="' + xhtmlEscape ( filename ) + '">' )
. appendTo ( 'body' )
. submit ( ) . remove ( ) ;
} } ) ;
} ) ( ) ;
2010-07-06 13:57:05 +00:00
}
} ) ;
2014-02-02 01:06:25 +00:00
2010-07-01 20:14:12 +00:00
// Do nothing if client support is found
2014-02-01 16:13:51 +00:00
if ( window . FileReader ) { return ; }
2010-07-06 13:57:05 +00:00
2010-07-01 20:14:12 +00:00
// Change these to appropriate script file
2014-02-12 03:48:48 +00:00
open _svg _action = svgEditor . curConfig . extPath + 'fileopen.php?type=load_svg' ;
import _svg _action = svgEditor . curConfig . extPath + 'fileopen.php?type=import_svg' ;
import _img _action = svgEditor . curConfig . extPath + 'fileopen.php?type=import_img' ;
2010-07-01 20:14:12 +00:00
// Set up function for PHP uploader to use
svgEditor . processFile = function ( str64 , type ) {
2013-10-29 06:54:31 +00:00
var xmlstr ;
2014-02-01 16:13:51 +00:00
if ( cancelled ) {
2010-07-05 15:38:06 +00:00
cancelled = false ;
return ;
}
$ ( '#dialog_box' ) . hide ( ) ;
2013-10-29 06:33:37 +00:00
2013-10-29 01:26:23 +00:00
if ( type !== 'import_img' ) {
2014-05-22 10:21:29 +00:00
xmlstr = Utils . decode64 ( str64 ) ;
2010-07-05 15:38:06 +00:00
}
2010-07-01 20:14:12 +00:00
2013-10-29 01:26:23 +00:00
switch ( type ) {
2010-07-01 20:14:12 +00:00
case 'load_svg' :
svgCanvas . clear ( ) ;
svgCanvas . setSvgString ( xmlstr ) ;
svgEditor . updateCanvas ( ) ;
break ;
case 'import_svg' :
svgCanvas . importSvgString ( xmlstr ) ;
svgEditor . updateCanvas ( ) ;
break ;
2010-07-05 15:38:06 +00:00
case 'import_img' :
svgCanvas . setGoodImage ( str64 ) ;
break ;
2010-07-01 20:14:12 +00:00
}
2013-10-29 01:26:23 +00:00
} ;
2010-07-01 20:14:12 +00:00
// Create upload form
2013-10-29 01:26:23 +00:00
open _svg _form = $ ( '<form>' ) ;
2010-07-01 20:14:12 +00:00
open _svg _form . attr ( {
enctype : 'multipart/form-data' ,
method : 'post' ,
action : open _svg _action ,
2010-07-06 13:57:05 +00:00
target : 'output_frame'
2010-07-01 20:14:12 +00:00
} ) ;
// Create import form
2013-10-29 01:26:23 +00:00
import _svg _form = open _svg _form . clone ( ) . attr ( 'action' , import _svg _action ) ;
2010-07-01 20:14:12 +00:00
// Create image form
2013-10-29 01:26:23 +00:00
import _img _form = open _svg _form . clone ( ) . attr ( 'action' , import _img _action ) ;
2010-07-01 20:14:12 +00:00
2014-02-02 01:06:25 +00:00
// It appears necessary to rebuild this input every time a file is
2010-07-01 20:14:12 +00:00
// selected so the same file can be picked and the change event can fire.
function rebuildInput ( form ) {
form . empty ( ) ;
var inp = $ ( '<input type="file" name="svg_file">' ) . appendTo ( form ) ;
2010-07-05 15:38:06 +00:00
function submit ( ) {
2014-02-18 23:57:49 +00:00
// This submits the form, which returns the file data using svgEditor.processFile()
2010-07-05 15:38:06 +00:00
form . submit ( ) ;
rebuildInput ( form ) ;
$ . process _cancel ( "Uploading..." , function ( ) {
cancelled = true ;
$ ( '#dialog_box' ) . hide ( ) ;
} ) ;
}
2010-07-01 20:14:12 +00:00
if ( form [ 0 ] == open _svg _form [ 0 ] ) {
inp . change ( function ( ) {
// This takes care of the "are you sure" dialog box
svgEditor . openPrep ( function ( ok ) {
if ( ! ok ) {
rebuildInput ( form ) ;
return ;
}
2010-07-05 15:38:06 +00:00
submit ( ) ;
2010-07-01 20:14:12 +00:00
} ) ;
} ) ;
} else {
inp . change ( function ( ) {
2014-02-18 23:57:49 +00:00
// This submits the form, which returns the file data using svgEditor.processFile()
2010-07-05 15:38:06 +00:00
submit ( ) ;
2010-07-01 20:14:12 +00:00
} ) ;
}
}
// Create the input elements
rebuildInput ( open _svg _form ) ;
rebuildInput ( import _svg _form ) ;
rebuildInput ( import _img _form ) ;
// Add forms to buttons
$ ( "#tool_open" ) . show ( ) . prepend ( open _svg _form ) ;
$ ( "#tool_import" ) . show ( ) . prepend ( import _svg _form ) ;
2010-07-05 15:38:06 +00:00
$ ( "#tool_image" ) . prepend ( import _img _form ) ;
2010-07-01 20:14:12 +00:00
}
} ) ;