1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-11-18 15:54:50 +00:00
TiddlyWiki5/plugins/tiddlywiki/external-attachments/startup.js
Jermolene e646d207c3 Add "external-attachments" plugin
This plugin provides support for importing tiddlers as external attachments -- it only works on platforms such as TiddlyDesktop that provide the required "path" property with imported files.

Using the plugin means that instead of importing binary files as self-contained tiddlers, they are imported as "skinny" tiddlers that reference the original file via the ''_canonical_uri'' field. This reduces the size of the wiki and thus improves performance. However, it does mean that the wiki is no longer fully self-contained
2017-10-11 17:54:03 +01:00

112 lines
3.5 KiB
JavaScript

/*\
title: $:/plugins/tiddlywiki/external-attachments/startup.js
type: application/javascript
module-type: startup
Startup initialisation
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var ENABLE_EXTERNAL_ATTACHMENTS_TITLE = "$:/config/ExternalAttachments/Enable",
USE_ABSOLUTE_FOR_DESCENDENTS_TITLE = "$:/config/ExternalAttachments/UseAbsoluteForDescendents",
USE_ABSOLUTE_FOR_NON_DESCENDENTS_TITLE = "$:/config/ExternalAttachments/UseAbsoluteForNonDescendents";
// Export name and synchronous status
exports.name = "external-attachments";
exports.platforms = ["browser"];
exports.after = ["startup"];
exports.synchronous = true;
exports.startup = function() {
test_makePathRelative();
$tw.hooks.addHook("th-importing-file",function(info) {
if(document.location.protocol === "file:" && info.isBinary && info.file.path && $tw.wiki.getTiddlerText(ENABLE_EXTERNAL_ATTACHMENTS_TITLE,"") === "yes") {
var locationPathParts = document.location.pathname.split("/").slice(0,-1),
filePathParts = info.file.path.split(/[\\\/]/mg).map(encodeURIComponent);
info.callback([
{
title: info.file.name,
type: info.type,
"_canonical_uri": makePathRelative(
filePathParts.join("/"),
locationPathParts.join("/"),
{
useAbsoluteForNonDescendents: $tw.wiki.getTiddlerText(USE_ABSOLUTE_FOR_NON_DESCENDENTS_TITLE,"") === "yes",
useAbsoluteForDescendents: $tw.wiki.getTiddlerText(USE_ABSOLUTE_FOR_DESCENDENTS_TITLE,"") === "yes"
}
)
}
]);
return true;
} else {
return false;
}
});
};
/*
Given a source absolute path and a root absolute path, returns the source path expressed as a relative path from the root path.
*/
function makePathRelative(sourcepath,rootpath,options) {
options = options || {};
var sourceParts = sourcepath.split("/"),
rootParts = rootpath.split("/"),
outputParts = [];
// Check that each path started with a slash
if(sourceParts[0] || rootParts[0]) {
throw "makePathRelative: both paths must be absolute";
}
// Identify any common portion from the start
var c = 1,
p;
while(c < sourceParts.length && c < rootParts.length && sourceParts[c] === rootParts[c]) {
c += 1;
}
// Return "." if there's nothing left
if(c === sourceParts.length && c === rootParts.length ) {
return "."
}
// Use an absolute path if required
if((options.useAbsoluteForNonDescendents && c < rootParts.length) || (options.useAbsoluteForDescendents && c === rootParts.length)) {
return sourcepath;
}
// Move up a directory for each directory left in the root
for(p = c; p < rootParts.length; p++) {
outputParts.push("..");
}
// Add on the remaining parts of the source path
for(p = c; p < sourceParts.length; p++) {
outputParts.push(sourceParts[p]);
}
return outputParts.join("/");
}
function test_makePathRelative() {
var msg = "makePathRelative test failed";
if(makePathRelative("/Users/me/something","/Users/you/something") !== "../../me/something") {
throw msg;
}
if(makePathRelative("/Users/me/something","/Users/you/something",{useAbsoluteForNonDescendents: true}) !== "/Users/me/something") {
throw msg;
}
if(makePathRelative("/Users/me/something/else","/Users/me/something") !== "else") {
throw msg;
}
if(makePathRelative("/Users/me/something","/Users/me/something/new") !== "..") {
throw msg;
}
if(makePathRelative("/Users/me/something","/Users/me/something/new",{useAbsoluteForNonDescendents: true}) !== "/Users/me/something") {
throw msg;
}
if(makePathRelative("/Users/me/something","/Users/me/something") !== ".") {
throw msg;
}
}
})();