You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							644 lines
						
					
					
						
							21 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							644 lines
						
					
					
						
							21 KiB
						
					
					
				| const e = (() => { | |
|     if ("undefined" == typeof self) return !1; | |
|     if ("top" in self && self !== top) try { | |
|       top.window.document._ = 0; | |
|     } catch (e) { | |
|       return !1; | |
|     } | |
|     return "showOpenFilePicker" in self; | |
|   })(), | |
|   t = e ? Promise.resolve().then(function () { | |
|     return l; | |
|   }) : Promise.resolve().then(function () { | |
|     return v; | |
|   }); | |
| async function n() { | |
|   return (await t).default(...arguments); | |
| } | |
| e ? Promise.resolve().then(function () { | |
|   return y; | |
| }) : Promise.resolve().then(function () { | |
|   return b; | |
| }); | |
| const a = e ? Promise.resolve().then(function () { | |
|   return m; | |
| }) : Promise.resolve().then(function () { | |
|   return k; | |
| }); | |
| async function o() { | |
|   return (await a).default(...arguments); | |
| } | |
| const s = async e => { | |
|   const t = await e.getFile(); | |
|   return t.handle = e, t; | |
| }; | |
| var c = async function () { | |
|     let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [{}]; | |
|     Array.isArray(e) || (e = [e]); | |
|     const t = []; | |
|     e.forEach((e, n) => { | |
|       t[n] = { | |
|         description: e.description || "Files", | |
|         accept: {} | |
|       }, e.mimeTypes ? e.mimeTypes.map(r => { | |
|         t[n].accept[r] = e.extensions || []; | |
|       }) : t[n].accept["*/*"] = e.extensions || []; | |
|     }); | |
|     const n = await window.showOpenFilePicker({ | |
|         id: e[0].id, | |
|         startIn: e[0].startIn, | |
|         types: t, | |
|         multiple: e[0].multiple || !1, | |
|         excludeAcceptAllOption: e[0].excludeAcceptAllOption || !1 | |
|       }), | |
|       r = await Promise.all(n.map(s)); | |
|     return e[0].multiple ? r : r[0]; | |
|   }, | |
|   l = { | |
|     __proto__: null, | |
|     default: c | |
|   }; | |
| function u(e) { | |
|   function t(e) { | |
|     if (Object(e) !== e) return Promise.reject(new TypeError(e + " is not an object.")); | |
|     var t = e.done; | |
|     return Promise.resolve(e.value).then(function (e) { | |
|       return { | |
|         value: e, | |
|         done: t | |
|       }; | |
|     }); | |
|   } | |
|   return u = function (e) { | |
|     this.s = e, this.n = e.next; | |
|   }, u.prototype = { | |
|     s: null, | |
|     n: null, | |
|     next: function () { | |
|       return t(this.n.apply(this.s, arguments)); | |
|     }, | |
|     return: function (e) { | |
|       var n = this.s.return; | |
|       return void 0 === n ? Promise.resolve({ | |
|         value: e, | |
|         done: !0 | |
|       }) : t(n.apply(this.s, arguments)); | |
|     }, | |
|     throw: function (e) { | |
|       var n = this.s.return; | |
|       return void 0 === n ? Promise.reject(e) : t(n.apply(this.s, arguments)); | |
|     } | |
|   }, new u(e); | |
| } | |
| const p = async function (e, t) { | |
|   let n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : e.name; | |
|   let r = arguments.length > 3 ? arguments[3] : undefined; | |
|   const i = [], | |
|     a = []; | |
|   var o, | |
|     s = !1, | |
|     c = !1; | |
|   try { | |
|     for (var l, d = function (e) { | |
|         var t, | |
|           n, | |
|           r, | |
|           i = 2; | |
|         for ("undefined" != typeof Symbol && (n = Symbol.asyncIterator, r = Symbol.iterator); i--;) { | |
|           if (n && null != (t = e[n])) return t.call(e); | |
|           if (r && null != (t = e[r])) return new u(t.call(e)); | |
|           n = "@@asyncIterator", r = "@@iterator"; | |
|         } | |
|         throw new TypeError("Object is not async iterable"); | |
|       }(e.values()); s = !(l = await d.next()).done; s = !1) { | |
|       const o = l.value, | |
|         s = `${n}/${o.name}`; | |
|       "file" === o.kind ? a.push(o.getFile().then(t => (t.directoryHandle = e, t.handle = o, Object.defineProperty(t, "webkitRelativePath", { | |
|         configurable: !0, | |
|         enumerable: !0, | |
|         get: () => s | |
|       })))) : "directory" !== o.kind || !t || r && r(o) || i.push(p(o, t, s, r)); | |
|     } | |
|   } catch (e) { | |
|     c = !0, o = e; | |
|   } finally { | |
|     try { | |
|       s && null != d.return && (await d.return()); | |
|     } finally { | |
|       if (c) throw o; | |
|     } | |
|   } | |
|   return [...(await Promise.all(i)).flat(), ...(await Promise.all(a))]; | |
| }; | |
| var d = async function () { | |
|     let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | |
|     e.recursive = e.recursive || !1, e.mode = e.mode || "read"; | |
|     const t = await window.showDirectoryPicker({ | |
|       id: e.id, | |
|       startIn: e.startIn, | |
|       mode: e.mode | |
|     }); | |
|     return (await (await t.values()).next()).done ? [t] : p(t, e.recursive, void 0, e.skipDirectory); | |
|   }, | |
|   y = { | |
|     __proto__: null, | |
|     default: d | |
|   }, | |
|   f = async function (e) { | |
|     let t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [{}]; | |
|     let n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; | |
|     let r = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : !1; | |
|     let i = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; | |
|     Array.isArray(t) || (t = [t]), t[0].fileName = t[0].fileName || "Untitled"; | |
|     const a = []; | |
|     let o = null; | |
|     if (e instanceof Blob && e.type ? o = e.type : e.headers && e.headers.get("content-type") && (o = e.headers.get("content-type")), t.forEach((e, t) => { | |
|       a[t] = { | |
|         description: e.description || "Files", | |
|         accept: {} | |
|       }, e.mimeTypes ? (0 === t && o && e.mimeTypes.push(o), e.mimeTypes.map(n => { | |
|         a[t].accept[n] = e.extensions || []; | |
|       })) : o ? a[t].accept[o] = e.extensions || [] : a[t].accept["*/*"] = e.extensions || []; | |
|     }), n) try { | |
|       await n.getFile(); | |
|     } catch (e) { | |
|       if (n = null, r) throw e; | |
|     } | |
|     const s = n || (await window.showSaveFilePicker({ | |
|       suggestedName: t[0].fileName, | |
|       id: t[0].id, | |
|       startIn: t[0].startIn, | |
|       types: a, | |
|       excludeAcceptAllOption: t[0].excludeAcceptAllOption || !1 | |
|     })); | |
|     !n && i && i(s); | |
|     const c = await s.createWritable(); | |
|     if ("stream" in e) { | |
|       const t = e.stream(); | |
|       return await t.pipeTo(c), s; | |
|     } | |
|     return "body" in e ? (await e.body.pipeTo(c), s) : (await c.write(await e), await c.close(), s); | |
|   }, | |
|   m = { | |
|     __proto__: null, | |
|     default: f | |
|   }, | |
|   w = async function () { | |
|     let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [{}]; | |
|     return Array.isArray(e) || (e = [e]), new Promise((t, n) => { | |
|       const r = document.createElement("input"); | |
|       r.type = "file"; | |
|       const i = [...e.map(e => e.mimeTypes || []), ...e.map(e => e.extensions || [])].join(); | |
|       r.multiple = e[0].multiple || !1, r.accept = i || "", r.style.display = "none", document.body.append(r); | |
|       const a = e => { | |
|           "function" == typeof o && o(), t(e); | |
|         }, | |
|         o = e[0].legacySetup && e[0].legacySetup(a, () => o(n), r), | |
|         s = () => { | |
|           window.removeEventListener("focus", s), r.remove(); | |
|         }; | |
|       r.addEventListener("click", () => { | |
|         window.addEventListener("focus", s); | |
|       }), r.addEventListener("change", () => { | |
|         window.removeEventListener("focus", s), r.remove(), a(r.multiple ? Array.from(r.files) : r.files[0]); | |
|       }), "showPicker" in HTMLInputElement.prototype ? r.showPicker() : r.click(); | |
|     }); | |
|   }, | |
|   v = { | |
|     __proto__: null, | |
|     default: w | |
|   }, | |
|   h = async function () { | |
|     let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [{}]; | |
|     return Array.isArray(e) || (e = [e]), e[0].recursive = e[0].recursive || !1, new Promise((t, n) => { | |
|       const r = document.createElement("input"); | |
|       r.type = "file", r.webkitdirectory = !0; | |
|       const i = e => { | |
|           "function" == typeof a && a(), t(e); | |
|         }, | |
|         a = e[0].legacySetup && e[0].legacySetup(i, () => a(n), r); | |
|       r.addEventListener("change", () => { | |
|         let t = Array.from(r.files); | |
|         e[0].recursive ? e[0].recursive && e[0].skipDirectory && (t = t.filter(t => t.webkitRelativePath.split("/").every(t => !e[0].skipDirectory({ | |
|           name: t, | |
|           kind: "directory" | |
|         })))) : t = t.filter(e => 2 === e.webkitRelativePath.split("/").length), i(t); | |
|       }), "showPicker" in HTMLInputElement.prototype ? r.showPicker() : r.click(); | |
|     }); | |
|   }, | |
|   b = { | |
|     __proto__: null, | |
|     default: h | |
|   }, | |
|   P = async function (e) { | |
|     let t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; | |
|     Array.isArray(t) && (t = t[0]); | |
|     const n = document.createElement("a"); | |
|     let r = e; | |
|     "body" in e && (r = await async function (e, t) { | |
|       const n = e.getReader(), | |
|         r = new ReadableStream({ | |
|           start: e => async function t() { | |
|             return n.read().then(_ref => { | |
|               let { | |
|                 done: n, | |
|                 value: r | |
|               } = _ref; | |
|               if (!n) return e.enqueue(r), t(); | |
|               e.close(); | |
|             }); | |
|           }() | |
|         }), | |
|         i = new Response(r), | |
|         a = await i.blob(); | |
|       return n.releaseLock(), new Blob([a], { | |
|         type: t | |
|       }); | |
|     }(e.body, e.headers.get("content-type"))), n.download = t.fileName || "Untitled", n.href = URL.createObjectURL(await r); | |
|     const i = () => { | |
|         "function" == typeof a && a(); | |
|       }, | |
|       a = t.legacySetup && t.legacySetup(i, () => a(), n); | |
|     return n.addEventListener("click", () => { | |
|       setTimeout(() => URL.revokeObjectURL(n.href), 3e4), i(); | |
|     }), n.click(), null; | |
|   }, | |
|   k = { | |
|     __proto__: null, | |
|     default: P | |
|   }; | |
| 
 | |
| function __variableDynamicImportRuntime0__(path) { | |
|   switch (path) { | |
|     case './locale/en.js': | |
|       return Promise.resolve().then(function () { return en$1; }); | |
|     case './locale/fr.js': | |
|       return Promise.resolve().then(function () { return fr$1; }); | |
|     case './locale/sv.js': | |
|       return Promise.resolve().then(function () { return sv$1; }); | |
|     case './locale/tr.js': | |
|       return Promise.resolve().then(function () { return tr$1; }); | |
|     case './locale/uk.js': | |
|       return Promise.resolve().then(function () { return uk$1; }); | |
|     case './locale/zh-CN.js': | |
|       return Promise.resolve().then(function () { return zhCN$1; }); | |
|     default: | |
|       return new Promise(function (resolve, reject) { | |
|         (typeof queueMicrotask === 'function' ? queueMicrotask : setTimeout)(reject.bind(null, new Error("Unknown variable dynamic import: " + path))); | |
|       }); | |
|   } | |
| } | |
| const name = 'opensave'; | |
| let handle = null; | |
| const loadExtensionTranslation = async function (svgEditor) { | |
|   let translationModule; | |
|   const lang = svgEditor.configObj.pref('lang'); | |
|   try { | |
|     translationModule = await __variableDynamicImportRuntime0__(`./locale/${lang}.js`); | |
|   } catch (_error) { | |
|     console.warn(`Missing translation (${lang}) for ${name} - using 'en'`); | |
|     translationModule = await Promise.resolve().then(function () { return en$1; }); | |
|   } | |
|   svgEditor.i18next.addResourceBundle(lang, 'translation', translationModule.default, true, true); | |
| }; | |
| var extOpensave = { | |
|   name, | |
|   async init(_S) { | |
|     const svgEditor = this; | |
|     const { | |
|       svgCanvas | |
|     } = svgEditor; | |
|     const { | |
|       $id, | |
|       $click | |
|     } = svgCanvas; | |
|     await loadExtensionTranslation(svgEditor); | |
|     /** | |
|     * @param {Event} e | |
|     * @returns {void} | |
|     */ | |
|     const importImage = e => { | |
|       $id('se-prompt-dialog').title = this.i18next.t('notification.loadingImage'); | |
|       $id('se-prompt-dialog').setAttribute('close', false); | |
|       e.stopPropagation(); | |
|       e.preventDefault(); | |
|       const file = e.type === 'drop' ? e.dataTransfer.files[0] : e.currentTarget.files[0]; | |
|       if (!file) { | |
|         $id('se-prompt-dialog').setAttribute('close', true); | |
|         return; | |
|       } | |
|       if (!file.type.includes('image')) { | |
|         return; | |
|       } | |
|       // Detected an image | |
|       // svg handling | |
|       let reader; | |
|       if (file.type.includes('svg')) { | |
|         reader = new FileReader(); | |
|         reader.onloadend = ev => { | |
|           // imgImport.shiftKey (shift key pressed or not) will determine if import should preserve dimension) | |
|           const newElement = this.svgCanvas.importSvgString(ev.target.result, imgImport.shiftKey); | |
|           this.svgCanvas.alignSelectedElements('m', 'page'); | |
|           this.svgCanvas.alignSelectedElements('c', 'page'); | |
|           // highlight imported element, otherwise we get strange empty selectbox | |
|           this.svgCanvas.selectOnly([newElement]); | |
|           $id('se-prompt-dialog').setAttribute('close', true); | |
|         }; | |
|         reader.readAsText(file); | |
|       } else { | |
|         // bitmap handling | |
|         reader = new FileReader(); | |
|         reader.onloadend = _ref => { | |
|           let { | |
|             target: { | |
|               result | |
|             } | |
|           } = _ref; | |
|           /** | |
|               * Insert the new image until we know its dimensions. | |
|               * @param {Float} imageWidth | |
|               * @param {Float} imageHeight | |
|               * @returns {void} | |
|               */ | |
|           const insertNewImage = (imageWidth, imageHeight) => { | |
|             const newImage = this.svgCanvas.addSVGElementsFromJson({ | |
|               element: 'image', | |
|               attr: { | |
|                 x: 0, | |
|                 y: 0, | |
|                 width: imageWidth, | |
|                 height: imageHeight, | |
|                 id: this.svgCanvas.getNextId(), | |
|                 style: 'pointer-events:inherit' | |
|               } | |
|             }); | |
|             this.svgCanvas.setHref(newImage, result); | |
|             this.svgCanvas.selectOnly([newImage]); | |
|             this.svgCanvas.alignSelectedElements('m', 'page'); | |
|             this.svgCanvas.alignSelectedElements('c', 'page'); | |
|             this.topPanel.updateContextPanel(); | |
|             $id('se-prompt-dialog').setAttribute('close', true); | |
|           }; | |
|           // create dummy img so we know the default dimensions | |
|           let imgWidth = 100; | |
|           let imgHeight = 100; | |
|           const img = new Image(); | |
|           img.style.opacity = 0; | |
|           img.addEventListener('load', () => { | |
|             imgWidth = img.offsetWidth || img.naturalWidth || img.width; | |
|             imgHeight = img.offsetHeight || img.naturalHeight || img.height; | |
|             insertNewImage(imgWidth, imgHeight); | |
|           }); | |
|           img.src = result; | |
|         }; | |
|         reader.readAsDataURL(file); | |
|       } | |
|     }; | |
|     // create an input with type file to open the filesystem dialog | |
|     const imgImport = document.createElement('input'); | |
|     imgImport.type = 'file'; | |
|     imgImport.addEventListener('change', importImage); | |
|     // dropping a svg file will import it in the svg as well | |
|     this.workarea.addEventListener('drop', importImage); | |
|     const clickClear = async function () { | |
|       const [x, y] = svgEditor.configObj.curConfig.dimensions; | |
|       const ok = await seConfirm(svgEditor.i18next.t('notification.QwantToClear')); | |
|       if (ok === 'Cancel') { | |
|         return; | |
|       } | |
|       svgEditor.leftPanel.clickSelect(); | |
|       svgEditor.svgCanvas.clear(); | |
|       svgEditor.svgCanvas.setResolution(x, y); | |
|       svgEditor.updateCanvas(true); | |
|       svgEditor.zoomImage(); | |
|       svgEditor.layersPanel.populateLayers(); | |
|       svgEditor.topPanel.updateContextPanel(); | |
|       svgEditor.topPanel.updateTitle('untitled.svg'); | |
|     }; | |
| 
 | |
|     /** | |
|      * By default,  this.editor.svgCanvas.open() is a no-op. It is up to an extension | |
|      *  mechanism (opera widget, etc.) to call `setCustomHandlers()` which | |
|      *  will make it do something. | |
|      * @returns {void} | |
|      */ | |
|     const clickOpen = async function () { | |
|       // ask user before clearing an unsaved SVG | |
|       const response = await svgEditor.openPrep(); | |
|       if (response === 'Cancel') { | |
|         return; | |
|       } | |
|       svgCanvas.clear(); | |
|       try { | |
|         const blob = await n({ | |
|           mimeTypes: ['image/*'] | |
|         }); | |
|         const svgContent = await blob.text(); | |
|         await svgEditor.loadSvgString(svgContent); | |
|         svgEditor.updateCanvas(); | |
|         handle = blob.handle; | |
|         svgEditor.topPanel.updateTitle(blob.name); | |
|         svgEditor.svgCanvas.runExtensions('onOpenedDocument', { | |
|           name: blob.name, | |
|           lastModified: blob.lastModified, | |
|           size: blob.size, | |
|           type: blob.type | |
|         }); | |
|       } catch (err) { | |
|         if (err.name !== 'AbortError') { | |
|           return console.error(err); | |
|         } | |
|       } | |
|     }; | |
|     const b64toBlob = function (b64Data) { | |
|       let contentType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; | |
|       let sliceSize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 512; | |
|       const byteCharacters = atob(b64Data); | |
|       const byteArrays = []; | |
|       for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) { | |
|         const slice = byteCharacters.slice(offset, offset + sliceSize); | |
|         const byteNumbers = new Array(slice.length); | |
|         for (let i = 0; i < slice.length; i++) { | |
|           byteNumbers[i] = slice.charCodeAt(i); | |
|         } | |
|         const byteArray = new Uint8Array(byteNumbers); | |
|         byteArrays.push(byteArray); | |
|       } | |
|       const blob = new Blob(byteArrays, { | |
|         type: contentType | |
|       }); | |
|       return blob; | |
|     }; | |
| 
 | |
|     /** | |
|      * | |
|      * @returns {void} | |
|      */ | |
|     const clickSave = async function (type) { | |
|       const $editorDialog = $id('se-svg-editor-dialog'); | |
|       const editingsource = $editorDialog.getAttribute('dialog') === 'open'; | |
|       if (editingsource) { | |
|         svgEditor.saveSourceEditor(); | |
|       } else { | |
|         // In the future, more options can be provided here | |
|         const saveOpts = { | |
|           images: svgEditor.configObj.pref('img_save'), | |
|           round_digits: 2 | |
|         }; | |
|         // remove the selected outline before serializing | |
|         svgCanvas.clearSelection(); | |
|         // Update save options if provided | |
|         if (saveOpts) { | |
|           const saveOptions = svgCanvas.mergeDeep(svgCanvas.getSvgOption(), saveOpts); | |
|           for (const [key, value] of Object.entries(saveOptions)) { | |
|             svgCanvas.setSvgOption(key, value); | |
|           } | |
|         } | |
|         svgCanvas.setSvgOption('apply', true); | |
| 
 | |
|         // no need for doctype, see https://jwatt.org/svg/authoring/#doctype-declaration | |
|         const svg = '<?xml version="1.0"?>\n' + svgCanvas.svgCanvasToString(); | |
|         const b64Data = svgCanvas.encode64(svg); | |
|         const blob = b64toBlob(b64Data, 'image/svg+xml'); | |
|         try { | |
|           if (type === 'save' && handle !== null) { | |
|             const throwIfExistingHandleNotGood = false; | |
|             handle = await o(blob, { | |
|               fileName: 'untitled.svg', | |
|               extensions: ['.svg'] | |
|             }, handle, throwIfExistingHandleNotGood); | |
|           } else { | |
|             handle = await o(blob, { | |
|               fileName: svgEditor.title, | |
|               extensions: ['.svg'] | |
|             }); | |
|           } | |
|           svgEditor.topPanel.updateTitle(handle.name); | |
|           svgCanvas.runExtensions('onSavedDocument', { | |
|             name: handle.name, | |
|             kind: handle.kind | |
|           }); | |
|         } catch (err) { | |
|           if (err.name !== 'AbortError') { | |
|             return console.error(err); | |
|           } | |
|         } | |
|       } | |
|     }; | |
|     return { | |
|       name: svgEditor.i18next.t(`${name}:name`), | |
|       // The callback should be used to load the DOM with the appropriate UI items | |
|       callback() { | |
|         const buttonTemplate = ` | |
|         <se-menu-item id="tool_clear" label="opensave.new_doc" shortcut="N" src="new.svg"></se-menu-item>`; | |
|         svgCanvas.insertChildAtIndex($id('main_button'), buttonTemplate, 0); | |
|         const openButtonTemplate = '<se-menu-item id="tool_open" label="opensave.open_image_doc" src="open.svg"></se-menu-item>'; | |
|         svgCanvas.insertChildAtIndex($id('main_button'), openButtonTemplate, 1); | |
|         const saveButtonTemplate = '<se-menu-item id="tool_save" label="opensave.save_doc" shortcut="S" src="saveImg.svg"></se-menu-item>'; | |
|         svgCanvas.insertChildAtIndex($id('main_button'), saveButtonTemplate, 2); | |
|         const saveAsButtonTemplate = '<se-menu-item id="tool_save_as" label="opensave.save_as_doc" src="saveImg.svg"></se-menu-item>'; | |
|         svgCanvas.insertChildAtIndex($id('main_button'), saveAsButtonTemplate, 3); | |
|         const importButtonTemplate = '<se-menu-item id="tool_import" label="tools.import_doc" src="importImg.svg"></se-menu-item>'; | |
|         svgCanvas.insertChildAtIndex($id('main_button'), importButtonTemplate, 4); | |
| 
 | |
|         // handler | |
|         $click($id('tool_clear'), clickClear.bind(this)); | |
|         $click($id('tool_open'), clickOpen.bind(this)); | |
|         $click($id('tool_save'), clickSave.bind(this, 'save')); | |
|         $click($id('tool_save_as'), clickSave.bind(this, 'saveas')); | |
|         // tool_import pressed with shiftKey will not scale the SVG | |
|         $click($id('tool_import'), ev => { | |
|           imgImport.shiftKey = ev.shiftKey; | |
|           imgImport.click(); | |
|         }); | |
|       } | |
|     }; | |
|   } | |
| }; | |
| 
 | |
| var en = { | |
|   opensave: { | |
|     new_doc: 'New Image', | |
|     open_image_doc: 'Open SVG', | |
|     save_doc: 'Save SVG', | |
|     save_as_doc: 'Save as SVG' | |
|   } | |
| }; | |
| 
 | |
| var en$1 = /*#__PURE__*/Object.freeze({ | |
|   __proto__: null, | |
|   default: en | |
| }); | |
| 
 | |
| var fr = { | |
|   opensave: { | |
|     new_doc: 'Nouvelle image', | |
|     open_image_doc: 'Ouvrir le SVG', | |
|     save_doc: 'Enregistrer l\'image', | |
|     save_as_doc: 'Enregistrer en tant qu\'image' | |
|   } | |
| }; | |
| 
 | |
| var fr$1 = /*#__PURE__*/Object.freeze({ | |
|   __proto__: null, | |
|   default: fr | |
| }); | |
| 
 | |
| var sv = { | |
|   opensave: { | |
|     new_doc: 'Ny bild', | |
|     open_image_doc: 'Öppna SVG', | |
|     save_doc: 'Spara SVG', | |
|     save_as_doc: 'Spara som SVG' | |
|   } | |
| }; | |
| 
 | |
| var sv$1 = /*#__PURE__*/Object.freeze({ | |
|   __proto__: null, | |
|   default: sv | |
| }); | |
| 
 | |
| var tr = { | |
|   opensave: { | |
|     new_doc: 'Yeni Resim', | |
|     open_image_doc: 'SVG Aç', | |
|     save_doc: 'SVG Kaydet', | |
|     save_as_doc: 'SVG olarak Kaydet' | |
|   } | |
| }; | |
| 
 | |
| var tr$1 = /*#__PURE__*/Object.freeze({ | |
|   __proto__: null, | |
|   default: tr | |
| }); | |
| 
 | |
| var uk = { | |
|   opensave: { | |
|     new_doc: 'Нове Зображення', | |
|     open_image_doc: 'Відкрити SVG', | |
|     save_doc: 'Зберегти SVG', | |
|     save_as_doc: 'Зберегти SVG як' | |
|   } | |
| }; | |
| 
 | |
| var uk$1 = /*#__PURE__*/Object.freeze({ | |
|   __proto__: null, | |
|   default: uk | |
| }); | |
| 
 | |
| var zhCN = { | |
|   opensave: { | |
|     new_doc: '新图片', | |
|     open_image_doc: '打开 SVG', | |
|     save_doc: '保存图像', | |
|     save_as_doc: '另存为图像' | |
|   } | |
| }; | |
| 
 | |
| var zhCN$1 = /*#__PURE__*/Object.freeze({ | |
|   __proto__: null, | |
|   default: zhCN | |
| }); | |
| 
 | |
| export { extOpensave as default }; | |
| //# sourceMappingURL=ext-opensave.js.map
 | |
| 
 |