/* globals jQuery */ 
 | 
/** 
 | 
 * ext-server_opensave.js 
 | 
 * 
 | 
 * @license MIT 
 | 
 * 
 | 
 * @copyright 2010 Alexis Deveria 
 | 
 * 
 | 
 */ 
 | 
import {canvg} from '../canvg/canvg.js'; 
 | 
  
 | 
export default { 
 | 
  name: 'server_opensave', 
 | 
  async init ({decode64, encode64, importLocale}) { 
 | 
    const strings = await importLocale(); 
 | 
    const svgEditor = this; 
 | 
    const $ = jQuery; 
 | 
    const svgCanvas = svgEditor.canvas; 
 | 
    function getFileNameFromTitle () { 
 | 
      const title = svgCanvas.getDocumentTitle(); 
 | 
      // We convert (to underscore) only those disallowed Win7 file name characters 
 | 
      return title.trim().replace(/[/\\:*?"<>|]/g, '_'); 
 | 
    } 
 | 
    function xhtmlEscape (str) { 
 | 
      return str.replace(/&(?!amp;)/g, '&').replace(/"/g, '"').replace(/</g, '<'); // < is actually disallowed above anyways 
 | 
    } 
 | 
    function clientDownloadSupport (filename, suffix, uri) { 
 | 
      const support = $('<a>')[0].download === ''; 
 | 
      let a; 
 | 
      if (support) { 
 | 
        a = $('<a>hidden</a>').attr({ 
 | 
          download: (filename || 'image') + suffix, 
 | 
          href: uri 
 | 
        }).css('display', 'none').appendTo('body'); 
 | 
        a[0].click(); 
 | 
        return true; 
 | 
      } 
 | 
    } 
 | 
    const 
 | 
      saveSvgAction = svgEditor.curConfig.extPath + 'filesave.php', 
 | 
      saveImgAction = svgEditor.curConfig.extPath + 'filesave.php'; 
 | 
      // Create upload target (hidden iframe) 
 | 
  
 | 
    let cancelled = false; 
 | 
  
 | 
    $('<iframe name="output_frame" src="#"/>').hide().appendTo('body'); 
 | 
    svgEditor.setCustomHandlers({ 
 | 
      save (win, data) { 
 | 
        const 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 
 | 
          filename = getFileNameFromTitle(); 
 | 
  
 | 
        if (clientDownloadSupport(filename, '.svg', 'data:image/svg+xml;charset=UTF-8;base64,' + encode64(svg))) { 
 | 
          return; 
 | 
        } 
 | 
  
 | 
        $('<form>').attr({ 
 | 
          method: 'post', 
 | 
          action: saveSvgAction, 
 | 
          target: 'output_frame' 
 | 
        }).append('<input type="hidden" name="output_svg" value="' + xhtmlEscape(svg) + '">') 
 | 
          .append('<input type="hidden" name="filename" value="' + xhtmlEscape(filename) + '">') 
 | 
          .appendTo('body') 
 | 
          .submit().remove(); 
 | 
      }, 
 | 
      exportPDF (win, data) { 
 | 
        const filename = getFileNameFromTitle(), 
 | 
          datauri = data.output; 
 | 
        if (clientDownloadSupport(filename, '.pdf', datauri)) { 
 | 
          return; 
 | 
        } 
 | 
        $('<form>').attr({ 
 | 
          method: 'post', 
 | 
          action: saveImgAction, 
 | 
          target: 'output_frame' 
 | 
        }).append('<input type="hidden" name="output_img" value="' + datauri + '">') 
 | 
          .append('<input type="hidden" name="mime" value="application/pdf">') 
 | 
          .append('<input type="hidden" name="filename" value="' + xhtmlEscape(filename) + '">') 
 | 
          .appendTo('body') 
 | 
          .submit().remove(); 
 | 
      }, 
 | 
      // Todo: Integrate this extension with a new built-in exportWindowType, "download" 
 | 
      async exportImage (win, data) { 
 | 
        const {issues, mimeType, quality} = data; 
 | 
  
 | 
        if (!$('#export_canvas').length) { 
 | 
          $('<canvas>', {id: 'export_canvas'}).hide().appendTo('body'); 
 | 
        } 
 | 
        const c = $('#export_canvas')[0]; 
 | 
  
 | 
        c.width = svgCanvas.contentW; 
 | 
        c.height = svgCanvas.contentH; 
 | 
        await canvg(c, data.svg); 
 | 
        const datauri = quality ? c.toDataURL(mimeType, quality) : c.toDataURL(mimeType); 
 | 
        // {uiStrings} = svgEditor; 
 | 
  
 | 
        // Check if there are issues 
 | 
        let pre, note = ''; 
 | 
        if (issues.length) { 
 | 
          pre = '\n \u2022 '; 
 | 
          note += ('\n\n' + pre + issues.join(pre)); 
 | 
        } 
 | 
  
 | 
        if (note.length) { 
 | 
          alert(note); 
 | 
        } 
 | 
  
 | 
        const filename = getFileNameFromTitle(); 
 | 
        const suffix = '.' + data.type.toLowerCase(); 
 | 
  
 | 
        if (clientDownloadSupport(filename, suffix, datauri)) { 
 | 
          return; 
 | 
        } 
 | 
  
 | 
        $('<form>').attr({ 
 | 
          method: 'post', 
 | 
          action: saveImgAction, 
 | 
          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(); 
 | 
      } 
 | 
    }); 
 | 
  
 | 
    // Do nothing if client support is found 
 | 
    if (window.FileReader) { return; } 
 | 
  
 | 
    // Change these to appropriate script file 
 | 
    const openSvgAction = svgEditor.curConfig.extPath + 'fileopen.php?type=load_svg'; 
 | 
    const importSvgAction = svgEditor.curConfig.extPath + 'fileopen.php?type=import_svg'; 
 | 
    const importImgAction = svgEditor.curConfig.extPath + 'fileopen.php?type=import_img'; 
 | 
  
 | 
    // Set up function for PHP uploader to use 
 | 
    svgEditor.processFile = function (str64, type) { 
 | 
      let xmlstr; 
 | 
      if (cancelled) { 
 | 
        cancelled = false; 
 | 
        return; 
 | 
      } 
 | 
  
 | 
      $('#dialog_box').hide(); 
 | 
  
 | 
      if (type !== 'import_img') { 
 | 
        xmlstr = decode64(str64); 
 | 
      } 
 | 
  
 | 
      switch (type) { 
 | 
      case 'load_svg': 
 | 
        svgCanvas.clear(); 
 | 
        svgCanvas.setSvgString(xmlstr); 
 | 
        svgEditor.updateCanvas(); 
 | 
        break; 
 | 
      case 'import_svg': 
 | 
        svgCanvas.importSvgString(xmlstr); 
 | 
        svgEditor.updateCanvas(); 
 | 
        break; 
 | 
      case 'import_img': 
 | 
        svgCanvas.setGoodImage(str64); 
 | 
        break; 
 | 
      } 
 | 
    }; 
 | 
  
 | 
    // Create upload form 
 | 
    const openSvgForm = $('<form>'); 
 | 
    openSvgForm.attr({ 
 | 
      enctype: 'multipart/form-data', 
 | 
      method: 'post', 
 | 
      action: openSvgAction, 
 | 
      target: 'output_frame' 
 | 
    }); 
 | 
  
 | 
    // Create import form 
 | 
    const importSvgForm = openSvgForm.clone().attr('action', importSvgAction); 
 | 
  
 | 
    // Create image form 
 | 
    const importImgForm = openSvgForm.clone().attr('action', importImgAction); 
 | 
  
 | 
    // It appears necessary to rebuild this input every time a file is 
 | 
    // selected so the same file can be picked and the change event can fire. 
 | 
    function rebuildInput (form) { 
 | 
      form.empty(); 
 | 
      const inp = $('<input type="file" name="svg_file">').appendTo(form); 
 | 
  
 | 
      function submit () { 
 | 
        // This submits the form, which returns the file data using svgEditor.processFile() 
 | 
        form.submit(); 
 | 
  
 | 
        rebuildInput(form); 
 | 
        $.process_cancel(strings.uploading, function () { 
 | 
          cancelled = true; 
 | 
          $('#dialog_box').hide(); 
 | 
        }); 
 | 
      } 
 | 
  
 | 
      if (form[0] === openSvgForm[0]) { 
 | 
        inp.change(function () { 
 | 
          // This takes care of the "are you sure" dialog box 
 | 
          svgEditor.openPrep(function (ok) { 
 | 
            if (!ok) { 
 | 
              rebuildInput(form); 
 | 
              return; 
 | 
            } 
 | 
            submit(); 
 | 
          }); 
 | 
        }); 
 | 
      } else { 
 | 
        inp.change(function () { 
 | 
          // This submits the form, which returns the file data using svgEditor.processFile() 
 | 
          submit(); 
 | 
        }); 
 | 
      } 
 | 
    } 
 | 
  
 | 
    // Create the input elements 
 | 
    rebuildInput(openSvgForm); 
 | 
    rebuildInput(importSvgForm); 
 | 
    rebuildInput(importImgForm); 
 | 
  
 | 
    // Add forms to buttons 
 | 
    $('#tool_open').show().prepend(openSvgForm); 
 | 
    $('#tool_import').show().prepend(importSvgForm); 
 | 
    $('#tool_image').prepend(importImgForm); 
 | 
  } 
 | 
}; 
 |