TiddlyWiki5/plugins/tiddlywiki/jszip/startup.js

105 wiersze
2.8 KiB
JavaScript

/*\
title: $:/plugins/tiddlywiki/jszip/startup.js
type: application/javascript
module-type: startup
Setup the root widget event handlers
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var JSZip = require("$:/plugins/tiddlywiki/jszip/jszip.js");
// Export name and synchronous status
exports.name = "jszip";
exports.platforms = ["browser"];
exports.after = ["startup"];
exports.synchronous = true;
// Install the root widget event handlers
exports.startup = function() {
$tw.rootWidget.addEventListener("tm-zip-create",function(event) {
if(event.param) {
var zip = new JSZip();
saveZipTiddler(event.param,zip);
}
});
$tw.rootWidget.addEventListener("tm-zip-add-text-file",function(event) {
var paramObject = event.paramObject || {};
if(event.param && paramObject.filename && paramObject.text) {
var zip = loadZipTiddler(event.param);
zip.file(paramObject.filename,paramObject.text);
saveZipTiddler(event.param,zip);
}
});
$tw.rootWidget.addEventListener("tm-zip-render-file",function(event) {
var paramObject = event.paramObject || {};
if(event.param && paramObject.filename && paramObject.template) {
var zip = loadZipTiddler(event.param),
outputType = paramObject.output || "text/plain",
templateTitle = paramObject.template,
text = $tw.wiki.renderTiddler(outputType,templateTitle,{
parseAsInline: paramObject.mode === "inline",
parentWidget: event.widget,
variables: {
currentTiddler: paramObject.tiddler
}
});
zip.file(paramObject.filename,text);
saveZipTiddler(event.param,zip);
}
});
$tw.rootWidget.addEventListener("tm-zip-download",function(event) {
var paramObject = event.paramObject || {};
if(event.param) {
downloadZipFile(event.param,paramObject.filename || "file.zip");
}
});
};
function loadZipTiddler(title) {
return $tw.wiki.getGlobalCache("jszip",function() {
var zip = new JSZip(),
tiddler = $tw.wiki.getTiddler(title);
if(tiddler && tiddler.fields.type === "application/zip") {
try {
zip.load(tiddler.fields.text,{
base64: true
});
} catch(e) {
console.log("JSZip error: " + e)
}
}
return zip;
});
}
function saveZipTiddler(title,zip) {
var data = zip.generate({
type: "base64"
});
$tw.wiki.addTiddler({
title: title,
type: "application/zip",
text: data
});
}
function downloadZipFile(title,filename) {
var tiddler = $tw.wiki.getTiddler(title);
if(tiddler && tiddler.fields.text && tiddler.fields.type === "application/zip") {
var link = document.createElement("a");
link.setAttribute("href","data:application/zip;base64," + encodeURIComponent(tiddler.fields.text));
link.setAttribute("download",filename);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
}
})();