1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2026-07-12 14:52:45 +00:00

Compare commits

..

1 Commits

Author SHA1 Message Date
Jeremy Ruston 2d14826032 Initial Commit 2026-02-16 18:04:54 +00:00
684 changed files with 5345 additions and 11558 deletions
+8 -8
View File
@@ -5,17 +5,17 @@ on:
- master - master
- tiddlywiki-com - tiddlywiki-com
env: env:
NODE_VERSION: "22.22" NODE_VERSION: "22"
jobs: jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v5
- uses: actions/setup-node@v6 - uses: actions/setup-node@v4
with: with:
node-version: "${{ env.NODE_VERSION }}" node-version: "${{ env.NODE_VERSION }}"
- run: "./bin/ci-test.sh" - run: "./bin/ci-test.sh"
- uses: actions/upload-artifact@v7 - uses: actions/upload-artifact@v4
if: always() if: always()
with: with:
name: playwright-report name: playwright-report
@@ -30,8 +30,8 @@ jobs:
TW5_BUILD_MAIN_EDITION: "./editions/prerelease" TW5_BUILD_MAIN_EDITION: "./editions/prerelease"
TW5_BUILD_OUTPUT: "./output/prerelease" TW5_BUILD_OUTPUT: "./output/prerelease"
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v5
- uses: actions/setup-node@v6 - uses: actions/setup-node@v4
with: with:
node-version: "${{ env.NODE_VERSION }}" node-version: "${{ env.NODE_VERSION }}"
- run: "./bin/ci-pre-build.sh" - run: "./bin/ci-pre-build.sh"
@@ -62,8 +62,8 @@ jobs:
TW5_BUILD_OUTPUT: "./output" TW5_BUILD_OUTPUT: "./output"
TW5_BUILD_ARCHIVE: "./output" TW5_BUILD_ARCHIVE: "./output"
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v5
- uses: actions/setup-node@v6 - uses: actions/setup-node@v4
with: with:
node-version: "${{ env.NODE_VERSION }}" node-version: "${{ env.NODE_VERSION }}"
- run: "./bin/ci-pre-build.sh" - run: "./bin/ci-pre-build.sh"
+1 -1
View File
@@ -20,7 +20,7 @@ jobs:
steps: steps:
- name: build-size-check - name: build-size-check
id: get_sizes id: get_sizes
uses: TiddlyWiki/cerebrus@v8.1 uses: TiddlyWiki/cerebrus@v6
with: with:
pr_number: ${{ github.event.pull_request.number }} pr_number: ${{ github.event.pull_request.number }}
repo: ${{ github.repository }} repo: ${{ github.repository }}
+1 -1
View File
@@ -25,7 +25,7 @@ jobs:
steps: steps:
- name: Build and check size - name: Build and check size
uses: TiddlyWiki/cerebrus@v8.1 uses: TiddlyWiki/cerebrus@v6
with: with:
pr_number: ${{ inputs.pr_number }} pr_number: ${{ inputs.pr_number }}
repo: ${{ github.repository }} repo: ${{ github.repository }}
+2 -2
View File
@@ -15,7 +15,7 @@ jobs:
steps: steps:
# Step 1: Validate PR paths # Step 1: Validate PR paths
- name: Validate PR Paths - name: Validate PR Paths
uses: TiddlyWiki/cerebrus@v8.1 uses: TiddlyWiki/cerebrus@v6
with: with:
pr_number: ${{ github.event.pull_request.number }} pr_number: ${{ github.event.pull_request.number }}
repo: ${{ github.repository }} repo: ${{ github.repository }}
@@ -26,7 +26,7 @@ jobs:
# Step 2: Validate change notes # Step 2: Validate change notes
- name: Validate Change Notes - name: Validate Change Notes
uses: TiddlyWiki/cerebrus@v8.1 uses: TiddlyWiki/cerebrus@v6
with: with:
pr_number: ${{ github.event.pull_request.number }} pr_number: ${{ github.event.pull_request.number }}
repo: ${{ github.repository }} repo: ${{ github.repository }}
+1 -11
View File
@@ -2,20 +2,10 @@
.c9/ .c9/
.vs/ .vs/
.vscode/ .vscode/
.claude/
# TiddlyWiki
tmp/ tmp/
output/ output/
node_modules/ node_modules/
$__StoryList.tid
# Playwright
/test-results/ /test-results/
/playwright-report/ /playwright-report/
/blob-report/
/playwright/.cache/ /playwright/.cache/
/playwright/.auth/ $__StoryList.tid
test-screenshots/
test-output.txt
.playwright-mcp
# TiddlyWiki MPC
.tw-mcp
+1 -1
View File
@@ -5,7 +5,7 @@
# Default to the current version number for building the plugin library # Default to the current version number for building the plugin library
if [ -z "$TW5_BUILD_VERSION" ]; then if [ -z "$TW5_BUILD_VERSION" ]; then
TW5_BUILD_VERSION=v5.5.0 TW5_BUILD_VERSION=v5.4.0
fi fi
echo "Using TW5_BUILD_VERSION as [$TW5_BUILD_VERSION]" echo "Using TW5_BUILD_VERSION as [$TW5_BUILD_VERSION]"
+1 -1
View File
@@ -45,7 +45,7 @@ git clone --depth=1 --branch=main "https://github.com/TiddlyWiki/tiddlywiki.org-
# Make the CNAME file that GitHub Pages requires # Make the CNAME file that GitHub Pages requires
# echo "tiddlywiki.org" > $TWORG_BUILD_OUTPUT/CNAME echo "tiddlywiki.org" > $TWORG_BUILD_OUTPUT/CNAME
# Delete any existing static content # Delete any existing static content
+32 -32
View File
@@ -15,40 +15,40 @@ var fs = require("fs"),
{ optimize } = require("svgo"), { optimize } = require("svgo"),
config = { config = {
plugins: [ plugins: [
"cleanupAttrs", 'cleanupAttrs',
"removeDoctype", 'removeDoctype',
"removeXMLProcInst", 'removeXMLProcInst',
"removeComments", 'removeComments',
"removeMetadata", 'removeMetadata',
"removeTitle", 'removeTitle',
"removeDesc", 'removeDesc',
"removeUselessDefs", 'removeUselessDefs',
"removeEditorsNSData", 'removeEditorsNSData',
"removeEmptyAttrs", 'removeEmptyAttrs',
"removeHiddenElems", 'removeHiddenElems',
"removeEmptyText", 'removeEmptyText',
"removeEmptyContainers", 'removeEmptyContainers',
// 'removeViewBox', // 'removeViewBox',
"cleanupEnableBackground", 'cleanupEnableBackground',
"convertStyleToAttrs", 'convertStyleToAttrs',
"convertColors", 'convertColors',
"convertPathData", 'convertPathData',
"convertTransform", 'convertTransform',
"removeUnknownsAndDefaults", 'removeUnknownsAndDefaults',
"removeNonInheritableGroupAttrs", 'removeNonInheritableGroupAttrs',
"removeUselessStrokeAndFill", 'removeUselessStrokeAndFill',
"removeUnusedNS", 'removeUnusedNS',
"cleanupIDs", 'cleanupIDs',
"cleanupNumericValues", 'cleanupNumericValues',
"moveElemsAttrsToGroup", 'moveElemsAttrsToGroup',
"moveGroupAttrsToElems", 'moveGroupAttrsToElems',
"collapseGroups", 'collapseGroups',
// 'removeRasterImages', // 'removeRasterImages',
"mergePaths", 'mergePaths',
"convertShapeToPath", 'convertShapeToPath',
"sortAttrs", 'sortAttrs',
//'removeDimensions', //'removeDimensions',
{name: "removeAttrs", params: { attrs: "(stroke|fill)" } } {name: 'removeAttrs', params: { attrs: '(stroke|fill)' } }
] ]
}; };
@@ -72,7 +72,7 @@ files.forEach(function(filename) {
var newSVG = header.join("\n") + "\n\n" + result.data.replace("&lt;&lt;now &quot;DD&quot;&gt;&gt;","<<now \"DD\">>"); var newSVG = header.join("\n") + "\n\n" + result.data.replace("&lt;&lt;now &quot;DD&quot;&gt;&gt;","<<now \"DD\">>");
fs.writeFileSync(filepath,newSVG); fs.writeFileSync(filepath,newSVG);
} else { } else {
console.log("Error " + err + " with " + filename); console.log("Error " + err + " with " + filename)
process.exit(); process.exit();
}; };
} }
+35 -90
View File
@@ -12,10 +12,10 @@ On the server this file is executed directly to boot TiddlyWiki. In the browser,
var _boot = (function($tw) { var _boot = (function($tw) {
/*jslint node: true, browser: true */
/*global modules: false, $tw: false */
"use strict"; "use strict";
if(typeof performance !== "undefined") { performance.mark("tw-boot-start"); }
// Include bootprefix if we're not given module data // Include bootprefix if we're not given module data
if(!$tw) { if(!$tw) {
$tw = require("./bootprefix.js").bootprefix(); $tw = require("./bootprefix.js").bootprefix();
@@ -37,7 +37,7 @@ if($tw.node) {
$tw.boot.log = function(str) { $tw.boot.log = function(str) {
$tw.boot.logMessages = $tw.boot.logMessages || []; $tw.boot.logMessages = $tw.boot.logMessages || [];
$tw.boot.logMessages.push(str); $tw.boot.logMessages.push(str);
}; }
/* /*
Check if an object has a property Check if an object has a property
@@ -47,14 +47,7 @@ $tw.utils.hop = function(object,property) {
}; };
/** @deprecated Use Array.isArray instead */ /** @deprecated Use Array.isArray instead */
$tw.utils.isArray = (value) => Array.isArray(value); $tw.utils.isArray = value => Array.isArray(value);
/*
Determine if a value is a date, even across VM boundaries
*/
$tw.utils.isDate = function(value) {
return Object.prototype.toString.call(value) === "[object Date]";
};
/* /*
Check if an array is equal by value and by reference. Check if an array is equal by value and by reference.
@@ -133,6 +126,9 @@ $tw.utils.pushTop = function(array,value) {
return array; return array;
}; };
/** @deprecated Use instanceof Date instead */
$tw.utils.isDate = value => value instanceof Date;
/** @deprecated Use array iterative methods instead */ /** @deprecated Use array iterative methods instead */
$tw.utils.each = function(object,callback) { $tw.utils.each = function(object,callback) {
if(object) { if(object) {
@@ -142,7 +138,7 @@ $tw.utils.each = function(object,callback) {
return next !== false; return next !== false;
}); });
} else { } else {
Object.entries(object).every((entry) => { Object.entries(object).every(entry => {
const next = callback(entry[1], entry[0], object); const next = callback(entry[1], entry[0], object);
return next !== false; return next !== false;
}); });
@@ -569,7 +565,7 @@ using a lowercase extension only.
*/ */
$tw.utils.getFileExtensionInfo = function(ext) { $tw.utils.getFileExtensionInfo = function(ext) {
return ext ? $tw.config.fileExtensionInfo[ext.toLowerCase()] : null; return ext ? $tw.config.fileExtensionInfo[ext.toLowerCase()] : null;
}; }
/* /*
Given an extension, get the correct encoding for that file. Given an extension, get the correct encoding for that file.
@@ -592,7 +588,7 @@ var globalCheck =[
" delete Object.prototype.__temp__;", " delete Object.prototype.__temp__;",
" }", " }",
" delete Object.prototype.__temp__;", " delete Object.prototype.__temp__;",
].join("\n"); ].join('\n');
/* /*
Run code globally with specified context variables in scope Run code globally with specified context variables in scope
@@ -620,7 +616,7 @@ $tw.utils.evalGlobal = function(code,context,filename,sandbox,allowGlobals) {
fn = Function("return " + code + "\n\n//# sourceURL=" + filename)(); // See https://github.com/TiddlyWiki/TiddlyWiki5/issues/6839 fn = Function("return " + code + "\n\n//# sourceURL=" + filename)(); // See https://github.com/TiddlyWiki/TiddlyWiki5/issues/6839
} else { } else {
if(sandbox){ if(sandbox){
fn = vm.runInContext(code,sandbox,filename); fn = vm.runInContext(code,sandbox,filename)
} else { } else {
fn = vm.runInThisContext(code,filename); fn = vm.runInThisContext(code,filename);
} }
@@ -731,7 +727,7 @@ $tw.utils.PasswordPrompt.prototype.createPrompt = function(options) {
var self = this; var self = this;
form.addEventListener("submit",function(event) { form.addEventListener("submit",function(event) {
// Collect the form data // Collect the form data
var data = {}; var data = {},t;
$tw.utils.each(form.elements,function(element) { $tw.utils.each(form.elements,function(element) {
if(element.name && element.value) { if(element.name && element.value) {
data[element.name] = element.value; data[element.name] = element.value;
@@ -777,7 +773,7 @@ $tw.utils.PasswordPrompt.prototype.removePrompt = function(promptInfo) {
promptInfo.form.parentNode.removeChild(promptInfo.form); promptInfo.form.parentNode.removeChild(promptInfo.form);
this.setWrapperDisplay(); this.setWrapperDisplay();
} }
}; }
/* /*
Crypto helper object for encrypted content. It maintains the password text in a closure, and provides methods to change Crypto helper object for encrypted content. It maintains the password text in a closure, and provides methods to change
@@ -816,7 +812,7 @@ $tw.utils.Crypto = function() {
}; };
this.hasPassword = function() { this.hasPassword = function() {
return !!currentPassword; return !!currentPassword;
}; }
this.encrypt = function(text,password) { this.encrypt = function(text,password) {
// set default ks:256 -- see: http://bitwiseshiftleft.github.io/sjcl/doc/convenience.js.html // set default ks:256 -- see: http://bitwiseshiftleft.github.io/sjcl/doc/convenience.js.html
return callSjcl("encrypt",text,password,{v:1,iter:10000,ks:256,ts:64,mode:"ccm",adata:"",cipher:"aes"}); return callSjcl("encrypt",text,password,{v:1,iter:10000,ks:256,ts:64,mode:"ccm",adata:"",cipher:"aes"});
@@ -834,7 +830,7 @@ Execute the module named 'moduleName'. The name can optionally be relative to th
$tw.modules.execute = function(moduleName,moduleRoot) { $tw.modules.execute = function(moduleName,moduleRoot) {
var name = moduleName; var name = moduleName;
if(moduleName.charAt(0) === ".") { if(moduleName.charAt(0) === ".") {
name = $tw.utils.resolvePath(moduleName,moduleRoot); name = $tw.utils.resolvePath(moduleName,moduleRoot)
} }
if(!$tw.modules.titles[name]) { if(!$tw.modules.titles[name]) {
if($tw.modules.titles[name + ".js"]) { if($tw.modules.titles[name + ".js"]) {
@@ -895,6 +891,7 @@ $tw.modules.execute = function(moduleName,moduleRoot) {
if(!moduleInfo) { if(!moduleInfo) {
// We could not find the module on this path // We could not find the module on this path
// Try to defer to browserify etc, or node // Try to defer to browserify etc, or node
var deferredModule;
if($tw.browser) { if($tw.browser) {
if(window.require) { if(window.require) {
try { try {
@@ -1149,7 +1146,8 @@ enableIndexers - Array of indexer names to enable, or null to use all available
*/ */
$tw.Wiki = function(options) { $tw.Wiki = function(options) {
options = options || {}; options = options || {};
var tiddlers = Object.create(null), // Hashmap of tiddlers var self = this,
tiddlers = Object.create(null), // Hashmap of tiddlers
tiddlerTitles = null, // Array of tiddler titles tiddlerTitles = null, // Array of tiddler titles
getTiddlerTitles = function() { getTiddlerTitles = function() {
if(!tiddlerTitles) { if(!tiddlerTitles) {
@@ -1160,30 +1158,6 @@ $tw.Wiki = function(options) {
pluginTiddlers = [], // Array of tiddlers containing registered plugins, ordered by priority pluginTiddlers = [], // Array of tiddlers containing registered plugins, ordered by priority
pluginInfo = Object.create(null), // Hashmap of parsed plugin content pluginInfo = Object.create(null), // Hashmap of parsed plugin content
shadowTiddlers = Object.create(null), // Hashmap by title of {source:, tiddler:} shadowTiddlers = Object.create(null), // Hashmap by title of {source:, tiddler:}
systemTiddlerTitles = null, // Array of system tiddler titles (starting with "$:/")
nonSystemTiddlerTitles = null, // Array of non-system tiddler titles
partitionTiddlerTitles = function() {
if(systemTiddlerTitles === null) {
systemTiddlerTitles = [];
nonSystemTiddlerTitles = [];
var titles = getTiddlerTitles();
for(var i = 0, length = titles.length; i < length; i++) {
if(titles[i].indexOf("$:/") === 0) {
systemTiddlerTitles.push(titles[i]);
} else {
nonSystemTiddlerTitles.push(titles[i]);
}
}
}
},
getSystemTiddlerTitles = function() {
partitionTiddlerTitles();
return systemTiddlerTitles;
},
getNonSystemTiddlerTitles = function() {
partitionTiddlerTitles();
return nonSystemTiddlerTitles;
},
shadowTiddlerTitles = null, shadowTiddlerTitles = null,
getShadowTiddlerTitles = function() { getShadowTiddlerTitles = function() {
if(!shadowTiddlerTitles) { if(!shadowTiddlerTitles) {
@@ -1227,25 +1201,17 @@ $tw.Wiki = function(options) {
shadow: this.isShadowTiddler(title), shadow: this.isShadowTiddler(title),
exists: this.tiddlerExists(title) exists: this.tiddlerExists(title)
} }
}; }
// Save the new tiddler // Save the new tiddler
tiddlers[title] = tiddler; tiddlers[title] = tiddler;
// Check we've got the title // Check we've got the title
tiddlerTitles = $tw.utils.insertSortedArray(tiddlerTitles || [],title); tiddlerTitles = $tw.utils.insertSortedArray(tiddlerTitles || [],title);
// Maintain system/non-system partitions
if(systemTiddlerTitles !== null) {
if(title.indexOf("$:/") === 0) {
$tw.utils.insertSortedArray(systemTiddlerTitles,title);
} else {
$tw.utils.insertSortedArray(nonSystemTiddlerTitles,title);
}
}
// Record the new tiddler state // Record the new tiddler state
updateDescriptor["new"] = { updateDescriptor["new"] = {
tiddler: tiddler, tiddler: tiddler,
shadow: this.isShadowTiddler(title), shadow: this.isShadowTiddler(title),
exists: this.tiddlerExists(title) exists: this.tiddlerExists(title)
}; }
// Update indexes // Update indexes
this.clearCache(title); this.clearCache(title);
this.clearGlobalCache(); this.clearGlobalCache();
@@ -1270,7 +1236,7 @@ $tw.Wiki = function(options) {
shadow: this.isShadowTiddler(title), shadow: this.isShadowTiddler(title),
exists: this.tiddlerExists(title) exists: this.tiddlerExists(title)
} }
}; }
// Delete the tiddler // Delete the tiddler
delete tiddlers[title]; delete tiddlers[title];
// Delete it from the list of titles // Delete it from the list of titles
@@ -1280,20 +1246,12 @@ $tw.Wiki = function(options) {
tiddlerTitles.splice(index,1); tiddlerTitles.splice(index,1);
} }
} }
// Delete from system/non-system partitions
if(systemTiddlerTitles !== null) {
var partitionArray = title.indexOf("$:/") === 0 ? systemTiddlerTitles : nonSystemTiddlerTitles;
var partitionIndex = partitionArray.indexOf(title);
if(partitionIndex !== -1) {
partitionArray.splice(partitionIndex,1);
}
}
// Record the new tiddler state // Record the new tiddler state
updateDescriptor["new"] = { updateDescriptor["new"] = {
tiddler: this.getTiddler(title), tiddler: this.getTiddler(title),
shadow: this.isShadowTiddler(title), shadow: this.isShadowTiddler(title),
exists: this.tiddlerExists(title) exists: this.tiddlerExists(title)
}; }
// Update indexes // Update indexes
this.clearCache(title); this.clearCache(title);
this.clearGlobalCache(); this.clearGlobalCache();
@@ -1326,16 +1284,6 @@ $tw.Wiki = function(options) {
return getTiddlerTitles().slice(0); return getTiddlerTitles().slice(0);
}; };
// Get an array of all system tiddler titles (returns cached array; do not mutate)
this.allSystemTitles = function() {
return getSystemTiddlerTitles();
};
// Get an array of all non-system tiddler titles (returns cached array; do not mutate)
this.allNonSystemTitles = function() {
return getNonSystemTiddlerTitles();
};
// Iterate through all tiddler titles // Iterate through all tiddler titles
this.each = function(callback) { this.each = function(callback) {
var titles = getTiddlerTitles(), var titles = getTiddlerTitles(),
@@ -1491,7 +1439,8 @@ $tw.Wiki = function(options) {
// Unregister the plugin tiddlers of a particular type, or null/undefined for any type, optionally restricting unregistering to an array of tiddler titles. Returns an array of the titles affected // Unregister the plugin tiddlers of a particular type, or null/undefined for any type, optionally restricting unregistering to an array of tiddler titles. Returns an array of the titles affected
this.unregisterPluginTiddlers = function(pluginType,titles) { this.unregisterPluginTiddlers = function(pluginType,titles) {
var unregisteredTitles = []; var self = this,
unregisteredTitles = [];
// Remove any previous registered plugins of this type // Remove any previous registered plugins of this type
for(var t=pluginTiddlers.length-1; t>=0; t--) { for(var t=pluginTiddlers.length-1; t>=0; t--) {
var tiddler = pluginTiddlers[t]; var tiddler = pluginTiddlers[t];
@@ -1505,6 +1454,7 @@ $tw.Wiki = function(options) {
// Unpack the currently registered plugins, creating shadow tiddlers for their constituent tiddlers // Unpack the currently registered plugins, creating shadow tiddlers for their constituent tiddlers
this.unpackPluginTiddlers = function() { this.unpackPluginTiddlers = function() {
var self = this;
// Sort the plugin titles by the `plugin-priority` field, if this field is missing, default to 1 // Sort the plugin titles by the `plugin-priority` field, if this field is missing, default to 1
pluginTiddlers.sort(function(a, b) { pluginTiddlers.sort(function(a, b) {
var priorityA = "plugin-priority" in a.fields ? a.fields["plugin-priority"] : 1; var priorityA = "plugin-priority" in a.fields ? a.fields["plugin-priority"] : 1;
@@ -1620,7 +1570,7 @@ $tw.Wiki.prototype.processSafeMode = function() {
// Assemble a report tiddler // Assemble a report tiddler
var titleReportTiddler = "TiddlyWiki Safe Mode", var titleReportTiddler = "TiddlyWiki Safe Mode",
report = []; report = [];
report.push("TiddlyWiki has been started in [[safe mode|https://tiddlywiki.com/static/SafeMode.html]]. All plugins are temporarily disabled. Most customisations have been disabled by renaming the following tiddlers:"); report.push("TiddlyWiki has been started in [[safe mode|https://tiddlywiki.com/static/SafeMode.html]]. All plugins are temporarily disabled. Most customisations have been disabled by renaming the following tiddlers:")
// Delete the overrides // Delete the overrides
overrides.forEach(function(title) { overrides.forEach(function(title) {
var tiddler = self.getTiddler(title), var tiddler = self.getTiddler(title),
@@ -1629,7 +1579,7 @@ $tw.Wiki.prototype.processSafeMode = function() {
self.addTiddler(new $tw.Tiddler(tiddler, {title: newTitle})); self.addTiddler(new $tw.Tiddler(tiddler, {title: newTitle}));
report.push("* [[" + title + "|" + newTitle + "]]"); report.push("* [[" + title + "|" + newTitle + "]]");
}); });
report.push(); report.push()
this.addTiddler(new $tw.Tiddler({title: titleReportTiddler, text: report.join("\n\n")})); this.addTiddler(new $tw.Tiddler({title: titleReportTiddler, text: report.join("\n\n")}));
// Set $:/DefaultTiddlers to point to our report // Set $:/DefaultTiddlers to point to our report
this.addTiddler(new $tw.Tiddler({title: "$:/DefaultTiddlers", text: "[[" + titleReportTiddler + "]]"})); this.addTiddler(new $tw.Tiddler({title: "$:/DefaultTiddlers", text: "[[" + titleReportTiddler + "]]"}));
@@ -2063,7 +2013,7 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
value = $tw.utils.stringifyList(path.relative(rootPath, filename).split(path.sep).slice(0, -1)); value = $tw.utils.stringifyList(path.relative(rootPath, filename).split(path.sep).slice(0, -1));
break; break;
case "filepath": case "filepath":
value = path.relative(rootPath, filename).split(path.sep).join("/"); value = path.relative(rootPath, filename).split(path.sep).join('/');
break; break;
case "filename": case "filename":
value = path.basename(filename); value = path.basename(filename);
@@ -2116,7 +2066,7 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
} }
}); });
return arrayOfFiles; return arrayOfFiles;
}; }
// Process the listed tiddlers // Process the listed tiddlers
$tw.utils.each(filesInfo.tiddlers,function(tidInfo) { $tw.utils.each(filesInfo.tiddlers,function(tidInfo) {
if(tidInfo.prefix && tidInfo.suffix) { if(tidInfo.prefix && tidInfo.suffix) {
@@ -2225,7 +2175,7 @@ Returns the path of the plugin folder
$tw.findLibraryItem = function(name,paths) { $tw.findLibraryItem = function(name,paths) {
var pathIndex = 0; var pathIndex = 0;
do { do {
var pluginPath = path.resolve(paths[pathIndex],"./" + name); var pluginPath = path.resolve(paths[pathIndex],"./" + name)
if(fs.existsSync(pluginPath) && fs.statSync(pluginPath).isDirectory()) { if(fs.existsSync(pluginPath) && fs.statSync(pluginPath).isDirectory()) {
return pluginPath; return pluginPath;
} }
@@ -2584,16 +2534,14 @@ $tw.boot.initStartup = function(options) {
} }
}); });
return result; return result;
}; }
} }
}; };
$tw.boot.loadStartup = function(options){ $tw.boot.loadStartup = function(options){
// Load tiddlers // Load tiddlers
if($tw.boot.tasks.readBrowserTiddlers) { if($tw.boot.tasks.readBrowserTiddlers) {
if(typeof performance !== "undefined") { performance.mark("tw-boot-store-read-start"); }
$tw.loadTiddlersBrowser(); $tw.loadTiddlersBrowser();
if(typeof performance !== "undefined") { performance.mark("tw-boot-store-read-end"); }
} else { } else {
$tw.loadTiddlersNode(); $tw.loadTiddlersNode();
} }
@@ -2603,9 +2551,8 @@ $tw.boot.loadStartup = function(options){
} }
// Give hooks a chance to modify the store // Give hooks a chance to modify the store
$tw.hooks.invokeHook("th-boot-tiddlers-loaded"); $tw.hooks.invokeHook("th-boot-tiddlers-loaded");
}; }
$tw.boot.execStartup = function(options){ $tw.boot.execStartup = function(options){
if(typeof performance !== "undefined") { performance.mark("tw-boot-exec-start"); }
// Unpack plugin tiddlers // Unpack plugin tiddlers
$tw.wiki.readPluginInfo(); $tw.wiki.readPluginInfo();
$tw.wiki.registerPluginTiddlers("plugin",$tw.safeMode ? ["$:/core"] : undefined); $tw.wiki.registerPluginTiddlers("plugin",$tw.safeMode ? ["$:/core"] : undefined);
@@ -2633,9 +2580,8 @@ $tw.boot.execStartup = function(options){
$tw.boot.executedStartupModules = Object.create(null); $tw.boot.executedStartupModules = Object.create(null);
$tw.boot.disabledStartupModules = $tw.boot.disabledStartupModules || []; $tw.boot.disabledStartupModules = $tw.boot.disabledStartupModules || [];
// Repeatedly execute the next eligible task // Repeatedly execute the next eligible task
if(typeof performance !== "undefined") { performance.mark("tw-boot-startup-modules-start"); }
$tw.boot.executeNextStartupTask(options.callback); $tw.boot.executeNextStartupTask(options.callback);
}; }
/* /*
Startup TiddlyWiki Startup TiddlyWiki
*/ */
@@ -2654,7 +2600,7 @@ $tw.addUnloadTask = function(task) {
if($tw.unloadTasks.indexOf(task) === -1) { if($tw.unloadTasks.indexOf(task) === -1) {
$tw.unloadTasks.push(task); $tw.unloadTasks.push(task);
} }
}; }
/* /*
Execute the remaining eligible startup tasks Execute the remaining eligible startup tasks
@@ -2701,8 +2647,7 @@ $tw.boot.executeNextStartupTask = function(callback) {
} }
taskIndex++; taskIndex++;
} }
if(typeof performance !== "undefined") { performance.mark("tw-boot-complete"); } if(typeof callback === 'function') {
if(typeof callback === "function") {
callback(); callback();
} }
return false; return false;
+1 -4
View File
@@ -14,8 +14,6 @@ See Boot.js for further details of the boot process.
/* eslint-disable @stylistic/indent */ /* eslint-disable @stylistic/indent */
if(typeof performance !== "undefined") { performance.mark("tw-bootprefix-start"); }
var _bootprefix = (function($tw) { var _bootprefix = (function($tw) {
"use strict"; "use strict";
@@ -25,7 +23,7 @@ $tw.boot = $tw.boot || Object.create(null);
// Config // Config
$tw.config = $tw.config || Object.create(null); $tw.config = $tw.config || Object.create(null);
$tw.config.maxEditFileSize = 200 * 1024 * 1024; // 200MB $tw.config.maxEditFileSize = 100 * 1024 * 1024; // 100MB
// Detect platforms // Detect platforms
if(!("browser" in $tw)) { if(!("browser" in $tw)) {
@@ -123,7 +121,6 @@ return $tw;
if(typeof(exports) === "undefined") { if(typeof(exports) === "undefined") {
// Set up $tw global for the browser // Set up $tw global for the browser
window.$tw = _bootprefix(window.$tw); window.$tw = _bootprefix(window.$tw);
if(typeof performance !== "undefined") { performance.mark("tw-bootprefix-end"); }
} else { } else {
// Export functionality as a module // Export functionality as a module
exports.bootprefix = _bootprefix; exports.bootprefix = _bootprefix;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,7 +1,6 @@
created: 20250909171928024 created: 20250909171928024
modified: 20251110133437795 modified: 20251110133437795
tags: Community/Team tags: Community/Team
leader: @kjharcombe
team: @MotovunJack team: @MotovunJack
title: Infrastructure Team title: Infrastructure Team
+1 -1
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -103,7 +103,7 @@ Commander.prototype.executeNextCommand = function() {
c = new command.Command(params,this); c = new command.Command(params,this);
err = c.execute(); err = c.execute();
if(err && typeof err.then === "function") { if(err && typeof err.then === "function") {
err.then((e) => { e ? this.callback(e) : this.executeNextCommand(); }); err.then(e => { e ? this.callback(e) : this.executeNextCommand(); });
} else if(err) { } else if(err) {
this.callback(err); this.callback(err);
} else { } else {
@@ -120,7 +120,7 @@ Commander.prototype.executeNextCommand = function() {
}); });
err = c.execute(); err = c.execute();
if(err && typeof err.then === "function") { if(err && typeof err.then === "function") {
err.then((e) => { if(e) this.callback(e); }); err.then(e => { if(e) this.callback(e); });
} else if(err) { } else if(err) {
this.callback(err); this.callback(err);
} }
+1 -1
View File
@@ -25,7 +25,7 @@ Command.prototype.execute = function() {
if(!filter) { if(!filter) {
return "No filter specified"; return "No filter specified";
} }
var commands = this.commander.wiki.filterTiddlers(filter); var commands = this.commander.wiki.filterTiddlers(filter)
if(commands.length === 0) { if(commands.length === 0) {
return "No tiddlers found for filter '" + filter + "'"; return "No tiddlers found for filter '" + filter + "'";
} }
+2 -1
View File
@@ -24,7 +24,8 @@ Command.prototype.execute = function() {
if(this.params.length < 1) { if(this.params.length < 1) {
return "Missing filter"; return "Missing filter";
} }
var wiki = this.commander.wiki, var self = this,
wiki = this.commander.wiki,
filter = this.params[0], filter = this.params[0],
tiddlers = wiki.filterTiddlers(filter); tiddlers = wiki.filterTiddlers(filter);
$tw.utils.each(tiddlers,function(title) { $tw.utils.each(tiddlers,function(title) {
+5 -5
View File
@@ -66,7 +66,7 @@ Command.prototype.fetchFiles = function(options) {
// Get the list of URLs // Get the list of URLs
var urls; var urls;
if(options.url) { if(options.url) {
urls = [options.url]; urls = [options.url]
} else if(options.urlFilter) { } else if(options.urlFilter) {
urls = this.commander.wiki.filterTiddlers(options.urlFilter); urls = this.commander.wiki.filterTiddlers(options.urlFilter);
} else { } else {
@@ -112,7 +112,7 @@ Command.prototype.fetchFile = function(url,options,callback,redirectCount) {
if(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) { if(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {
return self.fetchFile(response.headers.location,options,callback,redirectCount + 1); return self.fetchFile(response.headers.location,options,callback,redirectCount + 1);
} else { } else {
return callback("Error " + response.statusCode + " retrieving " + url); return callback("Error " + response.statusCode + " retrieving " + url)
} }
} }
}); });
@@ -153,18 +153,18 @@ Command.prototype.processBody = function(body,type,options,url) {
if(options.transformFilter) { if(options.transformFilter) {
var transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [""])[0]; var transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [""])[0];
if(transformedTitle) { if(transformedTitle) {
self.commander.log("Importing " + title + " as " + transformedTitle); self.commander.log("Importing " + title + " as " + transformedTitle)
newTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle}); newTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle});
} }
} else { } else {
self.commander.log("Importing " + title); self.commander.log("Importing " + title)
newTiddler = tiddler; newTiddler = tiddler;
} }
self.commander.wiki.importTiddler(newTiddler); self.commander.wiki.importTiddler(newTiddler);
count++; count++;
} }
}); });
self.commander.log("Imported " + count + " tiddlers"); self.commander.log("Imported " + count + " tiddlers")
}; };
exports.Command = Command; exports.Command = Command;
+2 -1
View File
@@ -22,7 +22,8 @@ var Command = function(params,commander,callback) {
Command.prototype.execute = function() { Command.prototype.execute = function() {
var self = this, var self = this,
fs = require("fs"); fs = require("fs"),
path = require("path");
if(this.params.length < 2) { if(this.params.length < 2) {
return "Missing parameters"; return "Missing parameters";
} }
+2 -1
View File
@@ -20,7 +20,8 @@ var Command = function(params,commander) {
}; };
Command.prototype.execute = function() { Command.prototype.execute = function() {
var fs = require("fs"); var fs = require("fs"),
path = require("path");
// Check that we don't already have a valid wiki folder // Check that we don't already have a valid wiki folder
if($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) { if($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {
return "Wiki folder is not empty"; return "Wiki folder is not empty";
+1
View File
@@ -19,6 +19,7 @@ exports.info = {
}; };
var Command = function(params,commander,callback) { var Command = function(params,commander,callback) {
var self = this;
this.params = params; this.params = params;
this.commander = commander; this.commander = commander;
this.callback = callback; this.callback = callback;
+3 -1
View File
@@ -21,7 +21,9 @@ var Command = function(params,commander,callback) {
}; };
Command.prototype.execute = function() { Command.prototype.execute = function() {
var self = this; var self = this,
fs = require("fs"),
path = require("path");
if(this.params.length < 1) { if(this.params.length < 1) {
return "Missing filename"; return "Missing filename";
} }
+2 -1
View File
@@ -21,7 +21,8 @@ var Command = function(params,commander,callback) {
}; };
Command.prototype.execute = function() { Command.prototype.execute = function() {
var path = require("path"); var fs = require("fs"),
path = require("path");
if(this.params.length < 1) { if(this.params.length < 1) {
return "Missing output path"; return "Missing output path";
} }
+2
View File
@@ -9,6 +9,8 @@ Render individual tiddlers and save the results to the specified files
"use strict"; "use strict";
var widget = require("$:/core/modules/widgets/widget.js");
exports.info = { exports.info = {
name: "render", name: "render",
synchronous: true synchronous: true
+2
View File
@@ -9,6 +9,8 @@ Command to render several tiddlers to a folder of files
"use strict"; "use strict";
var widget = require("$:/core/modules/widgets/widget.js");
exports.info = { exports.info = {
name: "rendertiddlers", name: "rendertiddlers",
synchronous: true synchronous: true
+1
View File
@@ -25,6 +25,7 @@ Command.prototype.execute = function() {
return "Missing filename filter"; return "Missing filename filter";
} }
var self = this, var self = this,
fs = require("fs"),
path = require("path"), path = require("path"),
result = null, result = null,
wiki = this.commander.wiki, wiki = this.commander.wiki,
+2
View File
@@ -9,6 +9,8 @@ Command to save several tiddlers to a folder of files
"use strict"; "use strict";
var widget = require("$:/core/modules/widgets/widget.js");
exports.info = { exports.info = {
name: "savetiddlers", name: "savetiddlers",
synchronous: true synchronous: true
+1 -1
View File
@@ -183,7 +183,7 @@ WikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {
}; };
WikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) { WikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {
var fileInfo, pathFilters, extFilters; var title = tiddler.fields.title, fileInfo, pathFilters, extFilters;
if(this.wiki.tiddlerExists("$:/config/FileSystemPaths")) { if(this.wiki.tiddlerExists("$:/config/FileSystemPaths")) {
pathFilters = this.wiki.getTiddlerText("$:/config/FileSystemPaths","").split("\n"); pathFilters = this.wiki.getTiddlerText("$:/config/FileSystemPaths","").split("\n");
} }
+1
View File
@@ -17,6 +17,7 @@ exports.info = {
}; };
var Command = function(params,commander,callback) { var Command = function(params,commander,callback) {
var self = this;
this.params = params; this.params = params;
this.commander = commander; this.commander = commander;
this.callback = callback; this.callback = callback;
+4 -1
View File
@@ -9,6 +9,8 @@ Command to modify selected tiddlers to set a field to the text of a template tid
"use strict"; "use strict";
var widget = require("$:/core/modules/widgets/widget.js");
exports.info = { exports.info = {
name: "setfield", name: "setfield",
synchronous: true synchronous: true
@@ -24,7 +26,8 @@ Command.prototype.execute = function() {
if(this.params.length < 4) { if(this.params.length < 4) {
return "Missing parameters"; return "Missing parameters";
} }
var wiki = this.commander.wiki, var self = this,
wiki = this.commander.wiki,
filter = this.params[0], filter = this.params[0],
fieldname = this.params[1] || "text", fieldname = this.params[1] || "text",
templatetitle = this.params[2], templatetitle = this.params[2],
+6 -5
View File
@@ -26,7 +26,7 @@ exports.getSubdirectories = function(dirPath) {
} }
}); });
return subdirs; return subdirs;
}; }
/* /*
Recursively (and synchronously) copy a directory and all its content Recursively (and synchronously) copy a directory and all its content
@@ -46,7 +46,8 @@ exports.copyDirectory = function(srcPath,dstPath) {
} }
// Function to copy a folder full of files // Function to copy a folder full of files
var copy = function(srcPath,dstPath) { var copy = function(srcPath,dstPath) {
var srcStats = fs.lstatSync(srcPath); var srcStats = fs.lstatSync(srcPath),
dstExists = fs.existsSync(dstPath);
if(srcStats.isFile()) { if(srcStats.isFile()) {
$tw.utils.copyFile(srcPath,dstPath); $tw.utils.copyFile(srcPath,dstPath);
} else if(srcStats.isDirectory()) { } else if(srcStats.isDirectory()) {
@@ -344,18 +345,18 @@ exports.generateTiddlerFilepath = function(title,options) {
// Replace any Windows control codes // Replace any Windows control codes
filepath = filepath.replace(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i,"_$1_"); filepath = filepath.replace(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i,"_$1_");
// Replace any leading spaces with the same number of underscores // Replace any leading spaces with the same number of underscores
filepath = filepath.replace(/^ +/,function (u) { return u.replace(/ /g, "_");}); filepath = filepath.replace(/^ +/,function (u) { return u.replace(/ /g, "_")});
//If the path does not start with "." or ".." && a path seperator, then //If the path does not start with "." or ".." && a path seperator, then
if(!/^\.{1,2}[/\\]/g.test(filepath)) { if(!/^\.{1,2}[/\\]/g.test(filepath)) {
// Don't let the filename start with any dots because such files are invisible on *nix // Don't let the filename start with any dots because such files are invisible on *nix
filepath = filepath.replace(/^\.+/g,function (u) { return u.replace(/\./g, "_");}); filepath = filepath.replace(/^\.+/g,function (u) { return u.replace(/\./g, "_")});
} }
// Replace any Unicode control codes // Replace any Unicode control codes
filepath = filepath.replace(/[\x00-\x1f\x80-\x9f]/g,"_"); filepath = filepath.replace(/[\x00-\x1f\x80-\x9f]/g,"_");
// Replace any characters that can't be used in cross-platform filenames // Replace any characters that can't be used in cross-platform filenames
filepath = $tw.utils.transliterate(filepath.replace(/<|>|~|\:|\"|\||\?|\*|\^/g,"_")); filepath = $tw.utils.transliterate(filepath.replace(/<|>|~|\:|\"|\||\?|\*|\^/g,"_"));
// Replace any dots or spaces at the end of the extension with the same number of underscores // Replace any dots or spaces at the end of the extension with the same number of underscores
extension = extension.replace(/[\. ]+$/, function (u) { return u.replace(/[\. ]/g, "_");}); extension = extension.replace(/[\. ]+$/, function (u) { return u.replace(/[\. ]/g, "_")});
// Truncate the extension if it is too long // Truncate the extension if it is too long
if(extension.length > 32) { if(extension.length > 32) {
extension = extension.substr(0,32); extension = extension.substr(0,32);
+3 -1
View File
@@ -10,7 +10,9 @@ Authenticator for WWW basic authentication
"use strict"; "use strict";
if($tw.node) { if($tw.node) {
var fs = require("fs"), var util = require("util"),
fs = require("fs"),
url = require("url"),
path = require("path"); path = require("path");
} }
+9 -9
View File
@@ -9,9 +9,8 @@ Serve tiddlers over http
"use strict"; "use strict";
let fs, url, path, querystring, crypto, zlib;
if($tw.node) { if($tw.node) {
var util = require("util"),
fs = require("fs"), fs = require("fs"),
url = require("url"), url = require("url"),
path = require("path"), path = require("path"),
@@ -42,7 +41,7 @@ function Server(options) {
} }
} }
// Setup the default required plugins // Setup the default required plugins
this.requiredPlugins = this.get("required-plugins").split(","); this.requiredPlugins = this.get("required-plugins").split(',');
// Initialise CORS // Initialise CORS
this.corsEnable = this.get("cors-enable") === "yes"; this.corsEnable = this.get("cors-enable") === "yes";
// Initialise CSRF // Initialise CSRF
@@ -63,9 +62,9 @@ function Server(options) {
this.authorizationPrincipals = { this.authorizationPrincipals = {
readers: (this.get("readers") || authorizedUserName).split(",").map($tw.utils.trim), readers: (this.get("readers") || authorizedUserName).split(",").map($tw.utils.trim),
writers: (this.get("writers") || authorizedUserName).split(",").map($tw.utils.trim) writers: (this.get("writers") || authorizedUserName).split(",").map($tw.utils.trim)
}; }
if(this.get("admin") || authorizedUserName !== "(anon)") { if(this.get("admin") || authorizedUserName !== "(anon)") {
this.authorizationPrincipals["admin"] = (this.get("admin") || authorizedUserName).split(",").map($tw.utils.trim); this.authorizationPrincipals["admin"] = (this.get("admin") || authorizedUserName).split(',').map($tw.utils.trim)
} }
// Load and initialise authenticators // Load and initialise authenticators
$tw.modules.forEachModuleOfType("authenticator", function(title,authenticatorDefinition) { $tw.modules.forEachModuleOfType("authenticator", function(title,authenticatorDefinition) {
@@ -92,7 +91,7 @@ function Server(options) {
this.listenOptions = { this.listenOptions = {
key: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsKeyFilepath),"utf8"), key: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsKeyFilepath),"utf8"),
cert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),"utf8"), cert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),"utf8"),
passphrase: tlsPassphrase || "" passphrase: tlsPassphrase || ''
}; };
this.protocol = "https"; this.protocol = "https";
} }
@@ -117,7 +116,7 @@ encoding: the encoding of the data to send (passed to the end method of the resp
*/ */
function sendResponse(request,response,statusCode,headers,data,encoding) { function sendResponse(request,response,statusCode,headers,data,encoding) {
if(this.enableBrowserCache && (statusCode == 200)) { if(this.enableBrowserCache && (statusCode == 200)) {
var hash = crypto.createHash("md5"); var hash = crypto.createHash('md5');
// Put everything into the hash that could change and invalidate the data that // Put everything into the hash that could change and invalidate the data that
// the browser already stored. The headers the data and the encoding. // the browser already stored. The headers the data and the encoding.
hash.update(data); hash.update(data);
@@ -212,6 +211,7 @@ Server.prototype.addAuthenticator = function(AuthenticatorClass) {
Server.prototype.findMatchingRoute = function(request,state) { Server.prototype.findMatchingRoute = function(request,state) {
for(var t=0; t<this.routes.length; t++) { for(var t=0; t<this.routes.length; t++) {
var potentialRoute = this.routes[t], var potentialRoute = this.routes[t],
pathRegExp = potentialRoute.path,
pathname = state.urlInfo.pathname, pathname = state.urlInfo.pathname,
match; match;
if(state.pathPrefix) { if(state.pathPrefix) {
@@ -250,7 +250,7 @@ Check whether a given user is authorized for the specified authorizationType ("r
Server.prototype.isAuthorized = function(authorizationType,username) { Server.prototype.isAuthorized = function(authorizationType,username) {
var principals = this.authorizationPrincipals[authorizationType] || []; var principals = this.authorizationPrincipals[authorizationType] || [];
return principals.indexOf("(anon)") !== -1 || (username && (principals.indexOf("(authenticated)") !== -1 || principals.indexOf(username) !== -1)); return principals.indexOf("(anon)") !== -1 || (username && (principals.indexOf("(authenticated)") !== -1 || principals.indexOf(username) !== -1));
}; }
Server.prototype.requestHandler = function(request,response,options) { Server.prototype.requestHandler = function(request,response,options) {
options = options || {}; options = options || {};
@@ -337,7 +337,7 @@ Server.prototype.requestHandler = function(request,response,options) {
request.on("end",function() { request.on("end",function() {
state.data = Buffer.concat(data); state.data = Buffer.concat(data);
route.handler(request,response,state); route.handler(request,response,state);
}); })
} else { } else {
response.writeHead(400,"Invalid bodyFormat " + route.bodyFormat + " in route " + route.method + " " + route.path.source); response.writeHead(400,"Invalid bodyFormat " + route.bodyFormat + " in route " + route.method + " " + route.path.source);
response.end(); response.end();
+6 -6
View File
@@ -11,20 +11,20 @@ Base64 UTF-8 utlity functions.
const{ TextEncoder, TextDecoder } = require("node:util"); const{ TextEncoder, TextDecoder } = require("node:util");
exports.btoa = (binstr) => Buffer.from(binstr, "binary").toString("base64"); exports.btoa = binstr => Buffer.from(binstr, "binary").toString("base64");
exports.atob = (b64) => Buffer.from(b64, "base64").toString("binary"); exports.atob = b64 => Buffer.from(b64, "base64").toString("binary");
function base64ToBytes(base64) { function base64ToBytes(base64) {
const binString = exports.atob(base64); const binString = exports.atob(base64);
return Uint8Array.from(binString, (m) => m.codePointAt(0)); return Uint8Array.from(binString, m => m.codePointAt(0));
}; };
function bytesToBase64(bytes) { function bytesToBase64(bytes) {
const binString = Array.from(bytes, (byte) => String.fromCodePoint(byte)).join(""); const binString = Array.from(bytes, byte => String.fromCodePoint(byte)).join("");
return exports.btoa(binString); return exports.btoa(binString);
}; };
exports.base64EncodeUtf8 = (str) => bytesToBase64(new TextEncoder().encode(str)); exports.base64EncodeUtf8 = str => bytesToBase64(new TextEncoder().encode(str));
exports.base64DecodeUtf8 = (str) => new TextDecoder().decode(base64ToBytes(str)); exports.base64DecodeUtf8 = str => new TextDecoder().decode(base64ToBytes(str));
+2 -1
View File
@@ -16,7 +16,8 @@ ignoreEnvironmentVariables: defaults to false
*/ */
exports.getAllPlugins = function(options) { exports.getAllPlugins = function(options) {
options = options || {}; options = options || {};
var path = require("path"), var fs = require("fs"),
path = require("path"),
tiddlers = {}; tiddlers = {};
// Collect up the library plugins // Collect up the library plugins
var collectPlugins = function(folder) { var collectPlugins = function(folder) {
-2
View File
@@ -15,8 +15,6 @@ Listing/Preview/TextRaw: Text (Raw)
Listing/Preview/Fields: Fields Listing/Preview/Fields: Fields
Listing/Preview/Diff: Diff Listing/Preview/Diff: Diff
Listing/Preview/DiffFields: Diff (Fields) Listing/Preview/DiffFields: Diff (Fields)
Listing/ImportOptions/Caption: Import options
Listing/ImportOptions/NoMatch: No import options apply to these files.
Listing/Rename/Tooltip: Rename tiddler before importing Listing/Rename/Tooltip: Rename tiddler before importing
Listing/Rename/Prompt: Rename to: Listing/Rename/Prompt: Rename to:
Listing/Rename/ConfirmRename: Rename tiddler Listing/Rename/ConfirmRename: Rename tiddler
+1 -1
View File
@@ -10,7 +10,7 @@ Advanced/ShadowInfo/Shadow/Hint: The tiddler <$link to=<<infoTiddler>>><$text te
Advanced/ShadowInfo/Shadow/Source: It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link> Advanced/ShadowInfo/Shadow/Source: It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>
Advanced/ShadowInfo/OverriddenShadow/Hint: It is overridden by an ordinary tiddler Advanced/ShadowInfo/OverriddenShadow/Hint: It is overridden by an ordinary tiddler
Advanced/CascadeInfo/Heading: Cascade Details Advanced/CascadeInfo/Heading: Cascade Details
Advanced/CascadeInfo/Hint: These are the view template segments that are resolved for each of the system view template cascades Advanced/CascadeInfo/Hint: These are the view template segments (tagged <<tag "$:/tags/ViewTemplate">>) using a cascade filter and their resulting template for the current tiddler.
Advanced/CascadeInfo/Detail/View: View Advanced/CascadeInfo/Detail/View: View
Advanced/CascadeInfo/Detail/ActiveCascadeFilter: Active cascade filter Advanced/CascadeInfo/Detail/ActiveCascadeFilter: Active cascade filter
Advanced/CascadeInfo/Detail/Template: Template Advanced/CascadeInfo/Detail/Template: Template
+3 -3
View File
@@ -18,13 +18,13 @@ class BackgroundActionDispatcher {
// Track the filter for the background actions // Track the filter for the background actions
this.filterTracker.track({ this.filterTracker.track({
filterString: "[all[tiddlers+shadows]tag[$:/tags/BackgroundAction]!is[draft]]", filterString: "[all[tiddlers+shadows]tag[$:/tags/BackgroundAction]!is[draft]]",
fnEnter: (title) => this.trackFilter(title), fnEnter: title => this.trackFilter(title),
fnLeave: (title, enterValue) => this.untrackFilter(enterValue), fnLeave: (title, enterValue) => this.untrackFilter(enterValue),
fnChange: (title, enterValue) => { fnChange: (title, enterValue) => {
this.untrackFilter(enterValue); this.untrackFilter(enterValue);
return this.trackFilter(title); return this.trackFilter(title);
}, },
fnProcess: (changes) => this.process(changes) fnProcess: changes => this.process(changes)
}); });
} }
@@ -75,7 +75,7 @@ class BackgroundActionTracker {
filterString: this.trackFilter, filterString: this.trackFilter,
fnEnter: () => { this.hasChanged = true; }, fnEnter: () => { this.hasChanged = true; },
fnLeave: () => { this.hasChanged = true; }, fnLeave: () => { this.hasChanged = true; },
fnProcess: (changes) => { fnProcess: changes => {
if(this.hasChanged) { if(this.hasChanged) {
this.hasChanged = false; this.hasChanged = false;
console.log("Processing background action", this.title); console.log("Processing background action", this.title);
@@ -10,7 +10,7 @@ Text editor operation to excise the selection to a new tiddler
"use strict"; "use strict";
function isMarkdown(mediaType) { function isMarkdown(mediaType) {
return mediaType === "text/markdown" || mediaType === "text/x-markdown"; return mediaType === 'text/markdown' || mediaType === 'text/x-markdown';
} }
exports["excise"] = function(event,operation) { exports["excise"] = function(event,operation) {
@@ -44,7 +44,7 @@ exports["wrap-selection"] = function(event,operation) {
break; break;
} }
return result; return result;
}; }
function togglePrefixSuffix() { function togglePrefixSuffix() {
if(o.text.substring(o.selStart - prefix.length, o.selStart + suffix.length) === prefix + suffix) { if(o.text.substring(o.selStart - prefix.length, o.selStart + suffix.length) === prefix + suffix) {
+4 -4
View File
@@ -69,17 +69,17 @@ class FilterTracker {
if(!tracker) return; if(!tracker) return;
const results = []; const results = [];
// Evaluate the filter and remove duplicate results // Evaluate the filter and remove duplicate results
$tw.utils.each(this.wiki.filterTiddlers(tracker.filterString), (title) => { $tw.utils.each(this.wiki.filterTiddlers(tracker.filterString), title => {
$tw.utils.pushTop(results, title); $tw.utils.pushTop(results, title);
}); });
// Process the newly entered results // Process the newly entered results
results.forEach((title) => { results.forEach(title => {
if(!tracker.previousResults.includes(title) && !tracker.resultValues[title] && tracker.fnEnter) { if(!tracker.previousResults.includes(title) && !tracker.resultValues[title] && tracker.fnEnter) {
tracker.resultValues[title] = tracker.fnEnter(title) || true; tracker.resultValues[title] = tracker.fnEnter(title) || true;
} }
}); });
// Process the results that have just left // Process the results that have just left
tracker.previousResults.forEach((title) => { tracker.previousResults.forEach(title => {
if(!results.includes(title) && tracker.resultValues[title] && tracker.fnLeave) { if(!results.includes(title) && tracker.resultValues[title] && tracker.fnLeave) {
tracker.fnLeave(title, tracker.resultValues[title]); tracker.fnLeave(title, tracker.resultValues[title]);
delete tracker.resultValues[title]; delete tracker.resultValues[title];
@@ -91,7 +91,7 @@ class FilterTracker {
processChanges(changes) { processChanges(changes) {
for(const tracker of this.trackers.values()) { for(const tracker of this.trackers.values()) {
Object.keys(changes).forEach((title) => { Object.keys(changes).forEach(title => {
if(title && tracker.previousResults.includes(title) && tracker.fnChange) { if(title && tracker.previousResults.includes(title) && tracker.fnChange) {
tracker.resultValues[title] = tracker.fnChange(title, tracker.resultValues[title]) || tracker.resultValues[title]; tracker.resultValues[title] = tracker.fnChange(title, tracker.resultValues[title]) || tracker.resultValues[title];
} }
+2 -2
View File
@@ -24,7 +24,7 @@ exports.cascade = function(operationSubFunction,options) {
} }
var output = filterFnList[index](options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({ var output = filterFnList[index](options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({
"currentTiddler": "" + title, "currentTiddler": "" + title,
"..currentTiddler": widget.getVariable("currentTiddler",{defaultValue:""}) "..currentTiddler": widget.getVariable("currentTiddler","")
})); }));
if(output.length !== 0) { if(output.length !== 0) {
result = output[0]; result = output[0];
@@ -34,5 +34,5 @@ exports.cascade = function(operationSubFunction,options) {
results.push(result); results.push(result);
}); });
} }
}; }
}; };
+2 -2
View File
@@ -18,7 +18,7 @@ exports.filter = function(operationSubFunction,options) {
results.each(function(title) { results.each(function(title) {
var filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({ var filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({
"currentTiddler": "" + title, "currentTiddler": "" + title,
"..currentTiddler": widget.getVariable("currentTiddler",{defaultValue:""}), "..currentTiddler": widget.getVariable("currentTiddler",""),
"index": "" + index, "index": "" + index,
"revIndex": "" + (results.length - 1 - index), "revIndex": "" + (results.length - 1 - index),
"length": "" + results.length "length": "" + results.length
@@ -30,5 +30,5 @@ exports.filter = function(operationSubFunction,options) {
}); });
results.remove(resultsToRemove); results.remove(resultsToRemove);
} }
}; }
}; };
+2
View File
@@ -7,6 +7,8 @@ Assign a value to a variable
\*/ \*/
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict"; "use strict";
/* /*
+3 -3
View File
@@ -20,7 +20,7 @@ exports.map = function(operationSubFunction,options) {
$tw.utils.each(inputTitles,function(title) { $tw.utils.each(inputTitles,function(title) {
var filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({ var filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({
"currentTiddler": "" + title, "currentTiddler": "" + title,
"..currentTiddler": widget.getVariable("currentTiddler",{defaultValue:""}), "..currentTiddler": widget.getVariable("currentTiddler",""),
"index": "" + index, "index": "" + index,
"revIndex": "" + (inputTitles.length - 1 - index), "revIndex": "" + (inputTitles.length - 1 - index),
"length": "" + inputTitles.length "length": "" + inputTitles.length
@@ -28,12 +28,12 @@ exports.map = function(operationSubFunction,options) {
if(filtered.length && flatten) { if(filtered.length && flatten) {
$tw.utils.each(filtered,function(value) { $tw.utils.each(filtered,function(value) {
results.push(value); results.push(value);
}); })
} else { } else {
results.push(filtered[0]||""); results.push(filtered[0]||"");
} }
++index; ++index;
}); });
} }
}; }
}; };
+2 -2
View File
@@ -17,7 +17,7 @@ exports.reduce = function(operationSubFunction,options) {
results.each(function(title) { results.each(function(title) {
var list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({ var list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({
"currentTiddler": "" + title, "currentTiddler": "" + title,
"..currentTiddler": widget.getVariable("currentTiddler",{defaultValue:""}), "..currentTiddler": widget.getVariable("currentTiddler"),
"index": "" + index, "index": "" + index,
"revIndex": "" + (results.length - 1 - index), "revIndex": "" + (results.length - 1 - index),
"length": "" + results.length, "length": "" + results.length,
@@ -31,5 +31,5 @@ exports.reduce = function(operationSubFunction,options) {
results.clear(); results.clear();
results.push(accumulator); results.push(accumulator);
} }
}; }
}; };
+2 -2
View File
@@ -24,7 +24,7 @@ exports.sort = function(operationSubFunction,options) {
results.each(function(title) { results.each(function(title) {
var key = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({ var key = operationSubFunction(options.wiki.makeTiddlerIterator([title]),widget.makeFakeWidgetWithVariables({
"currentTiddler": "" + title, "currentTiddler": "" + title,
"..currentTiddler": widget.getVariable("currentTiddler",{defaultValue:""}) "..currentTiddler": widget.getVariable("currentTiddler")
})); }));
sortKeys.push(key[0] || ""); sortKeys.push(key[0] || "");
}); });
@@ -43,5 +43,5 @@ exports.sort = function(operationSubFunction,options) {
results.push(inputTitles[index]); results.push(inputTitles[index]);
}); });
} }
}; }
}; };
+12 -29
View File
@@ -43,7 +43,7 @@ function parseFilterOperation(operators,filterString,p) {
var bracket = filterString.charAt(nextBracketPos); var bracket = filterString.charAt(nextBracketPos);
operator.operator = filterString.substring(p,nextBracketPos); operator.operator = filterString.substring(p,nextBracketPos);
// Any suffix? // Any suffix?
var colon = operator.operator.indexOf(":"); var colon = operator.operator.indexOf(':');
if(colon > -1) { if(colon > -1) {
// The raw suffix for older filters // The raw suffix for older filters
operator.suffix = operator.operator.substring(colon + 1); operator.suffix = operator.operator.substring(colon + 1);
@@ -108,7 +108,7 @@ function parseFilterOperation(operators,filterString,p) {
} }
operator.operands.push(operand); operator.operands.push(operand);
p = nextBracketPos + 1; p = nextBracketPos + 1;
}; }
p = nextBracketPos + 1; p = nextBracketPos + 1;
parseOperand(bracket); parseOperand(bracket);
@@ -228,7 +228,7 @@ exports.getFilterRunPrefixes = function() {
$tw.modules.applyMethods("filterrunprefix",this.filterRunPrefixes); $tw.modules.applyMethods("filterrunprefix",this.filterRunPrefixes);
} }
return this.filterRunPrefixes; return this.filterRunPrefixes;
}; }
exports.filterTiddlers = function(filterString,widget,source) { exports.filterTiddlers = function(filterString,widget,source) {
var fn = this.compileFilter(filterString); var fn = this.compileFilter(filterString);
@@ -261,7 +261,6 @@ exports.compileFilter = function(filterString) {
var filterOperators = this.getFilterOperators(); var filterOperators = this.getFilterOperators();
// Assemble array of functions, one for each operation // Assemble array of functions, one for each operation
var operationFunctions = []; var operationFunctions = [];
var operationSubFunctions = []; // Unwrapped sub-functions for fast path
// Step through the operations // Step through the operations
var self = this; var self = this;
$tw.utils.each(filterParseTree,function(operation) { $tw.utils.each(filterParseTree,function(operation) {
@@ -290,18 +289,14 @@ exports.compileFilter = function(filterString) {
operand.value = self.getTextReference(operand.text,"",currTiddlerTitle); operand.value = self.getTextReference(operand.text,"",currTiddlerTitle);
operand.multiValue = [operand.value]; operand.multiValue = [operand.value];
} else if(operand.variable) { } else if(operand.variable) {
if(!operand._varTree) { var varTree = $tw.utils.parseFilterVariable(operand.text);
operand._varTree = $tw.utils.parseFilterVariable(operand.text); operand.value = widgetClass.evaluateVariable(widget,varTree.name,{params: varTree.params, source: source})[0] || "";
}
operand.value = widgetClass.evaluateVariable(widget,operand._varTree.name,{params: operand._varTree.params, source: source})[0] || "";
operand.multiValue = [operand.value]; operand.multiValue = [operand.value];
} else if(operand.multiValuedVariable) { } else if(operand.multiValuedVariable) {
if(!operand._varTree) { var varTree = $tw.utils.parseFilterVariable(operand.text);
operand._varTree = $tw.utils.parseFilterVariable(operand.text); var resultList = widgetClass.evaluateVariable(widget,varTree.name,{params: varTree.params, source: source});
}
var resultList = widgetClass.evaluateVariable(widget,operand._varTree.name,{params: operand._varTree.params, source: source});
if((resultList.length > 0 && resultList[0] !== undefined) || resultList.length === 0) { if((resultList.length > 0 && resultList[0] !== undefined) || resultList.length === 0) {
operand.multiValue = widgetClass.evaluateVariable(widget,operand._varTree.name,{params: operand._varTree.params, source: source}) || []; operand.multiValue = widgetClass.evaluateVariable(widget,varTree.name,{params: varTree.params, source: source}) || [];
operand.value = operand.multiValue[0] || ""; operand.value = operand.multiValue[0] || "";
} else { } else {
operand.value = ""; operand.value = "";
@@ -348,7 +343,6 @@ exports.compileFilter = function(filterString) {
return resultArray; return resultArray;
} }
}; };
operationSubFunctions.push(operationSubFunction);
var filterRunPrefixes = self.getFilterRunPrefixes(); var filterRunPrefixes = self.getFilterRunPrefixes();
// Wrap the operator functions in a wrapper function that depends on the prefix // Wrap the operator functions in a wrapper function that depends on the prefix
operationFunctions.push((function() { operationFunctions.push((function() {
@@ -378,10 +372,6 @@ exports.compileFilter = function(filterString) {
} }
})()); })());
}); });
// Detect single "or" run for fast path (bypass LinkedList)
var isSingleOrRun = filterParseTree.length === 1 &&
(!filterParseTree[0].prefix || filterParseTree[0].prefix === "");
var singleOrSubFunction = isSingleOrRun ? operationSubFunctions[0] : null;
// Return a function that applies the operations to a source iterator of tiddler titles // Return a function that applies the operations to a source iterator of tiddler titles
var fnMeasured = $tw.perf.measure("filter: " + filterString,function filterFunction(source,widget) { var fnMeasured = $tw.perf.measure("filter: " + filterString,function filterFunction(source,widget) {
if(!source) { if(!source) {
@@ -392,14 +382,9 @@ exports.compileFilter = function(filterString) {
if(!widget) { if(!widget) {
widget = $tw.rootWidget; widget = $tw.rootWidget;
} }
self.filterRecursionCount = (self.filterRecursionCount || 0) + 1;
var resultArray;
if(self.filterRecursionCount < MAX_FILTER_DEPTH) {
if(singleOrSubFunction) {
// Fast path: single "or" run, return array directly without LinkedList
resultArray = singleOrSubFunction(source,widget);
} else {
var results = new $tw.utils.LinkedList(); var results = new $tw.utils.LinkedList();
self.filterRecursionCount = (self.filterRecursionCount || 0) + 1;
if(self.filterRecursionCount < MAX_FILTER_DEPTH) {
$tw.utils.each(operationFunctions,function(operationFunction) { $tw.utils.each(operationFunctions,function(operationFunction) {
var operationResult = operationFunction(results,source,widget); var operationResult = operationFunction(results,source,widget);
if(operationResult) { if(operationResult) {
@@ -409,13 +394,11 @@ exports.compileFilter = function(filterString) {
} }
} }
}); });
resultArray = results.toArray();
}
} else { } else {
resultArray = ["/**-- Excessive filter recursion --**/"]; results.push("/**-- Excessive filter recursion --**/");
} }
self.filterRecursionCount = self.filterRecursionCount - 1; self.filterRecursionCount = self.filterRecursionCount - 1;
return resultArray; return results.toArray();
}); });
if(this.filterCacheCount >= 2000) { if(this.filterCacheCount >= 2000) {
// To prevent memory leak, we maintain an upper limit for cache size. // To prevent memory leak, we maintain an upper limit for cache size.
+1 -1
View File
@@ -32,4 +32,4 @@ var modes = {
"gt": function(value) {return value > 0;}, "gt": function(value) {return value > 0;},
"lteq": function(value) {return value <= 0;}, "lteq": function(value) {return value <= 0;},
"lt": function(value) {return value < 0;} "lt": function(value) {return value < 0;}
}; }
+1 -1
View File
@@ -31,4 +31,4 @@ exports["deserialize"] = function(source,operator,options) {
return [$tw.language.getString("Error/DeserializeOperator/MissingOperand")]; return [$tw.language.getString("Error/DeserializeOperator/MissingOperand")];
} }
return results; return results;
}; }
+1 -1
View File
@@ -53,7 +53,7 @@ exports.field = function(source,operator,options) {
if(source.byField && operator.operand) { if(source.byField && operator.operand) {
indexedResults = source.byField(fieldname,operator.operand); indexedResults = source.byField(fieldname,operator.operand);
if(indexedResults) { if(indexedResults) {
return indexedResults; return indexedResults
} }
} }
source(function(tiddler,title) { source(function(tiddler,title) {
+1 -1
View File
@@ -19,7 +19,7 @@ exports.filter = function(source,operator,options) {
source(function(tiddler,title) { source(function(tiddler,title) {
var list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),options.widget.makeFakeWidgetWithVariables({ var list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),options.widget.makeFakeWidgetWithVariables({
"currentTiddler": "" + title, "currentTiddler": "" + title,
"..currentTiddler": options.widget.getVariable("currentTiddler",{defaultValue:""}) "..currentTiddler": options.widget.getVariable("currentTiddler","")
})); }));
if((list.length > 0) === target) { if((list.length > 0) === target) {
results.push(title); results.push(title);
+1 -1
View File
@@ -13,7 +13,7 @@ returns the value at a given index of datatiddlers
Export our filter function Export our filter function
*/ */
exports.getindex = function(source,operator,options) { exports.getindex = function(source,operator,options) {
var data,results = []; var data,title,results = [];
if(operator.operand){ if(operator.operand){
source(function(tiddler,title) { source(function(tiddler,title) {
title = tiddler ? tiddler.fields.title : title; title = tiddler ? tiddler.fields.title : title;
-12
View File
@@ -13,18 +13,6 @@ Filter function for [is[shadow]]
Export our filter function Export our filter function
*/ */
exports.shadow = function(source,prefix,options) { exports.shadow = function(source,prefix,options) {
// Fast path: when source is wiki.each (all real tiddlers), use shadow title list
if(source === options.wiki.each && prefix !== "!") {
// Return real tiddlers that are also shadow tiddlers (overridden shadows)
var results = [],
shadowTitles = options.wiki.allShadowTitles();
for(var i = 0, len = shadowTitles.length; i < len; i++) {
if(options.wiki.tiddlerExists(shadowTitles[i])) {
results.push(shadowTitles[i]);
}
}
return results;
}
var results = []; var results = [];
if(prefix === "!") { if(prefix === "!") {
source(function(tiddler,title) { source(function(tiddler,title) {
-8
View File
@@ -13,14 +13,6 @@ Filter function for [is[system]]
Export our filter function Export our filter function
*/ */
exports.system = function(source,prefix,options) { exports.system = function(source,prefix,options) {
// Fast path: when iterating all tiddlers, use pre-partitioned arrays
if(source === options.wiki.each) {
if(prefix === "!") {
return options.wiki.allNonSystemTitles();
} else {
return options.wiki.allSystemTitles();
}
}
var results = []; var results = [];
if(prefix === "!") { if(prefix === "!") {
source(function(tiddler,title) { source(function(tiddler,title) {
-7
View File
@@ -13,13 +13,6 @@ Filter function for [is[tiddler]]
Export our filter function Export our filter function
*/ */
exports.tiddler = function(source,prefix,options) { exports.tiddler = function(source,prefix,options) {
// Fast path: wiki.each only iterates real tiddlers, all of which exist
if(source === options.wiki.each) {
if(prefix === "!") {
return []; // No real tiddler fails tiddlerExists
}
return source; // Return iterator directly; all real tiddlers pass
}
var results = []; var results = [];
if(prefix === "!") { if(prefix === "!") {
source(function(tiddler,title) { source(function(tiddler,title) {
+5 -5
View File
@@ -157,13 +157,13 @@ function convertDataItemValueToStrings(item) {
if(item === undefined) { if(item === undefined) {
return undefined; return undefined;
} else if(item === null) { } else if(item === null) {
return ["null"]; return ["null"]
} else if(typeof item === "object") { } else if(typeof item === "object") {
var results = [],i,t; var results = [],i,t;
if(Array.isArray(item)) { if(Array.isArray(item)) {
// Return all the items in arrays recursively // Return all the items in arrays recursively
for(i=0; i<item.length; i++) { for(i=0; i<item.length; i++) {
t = convertDataItemValueToStrings(item[i]); t = convertDataItemValueToStrings(item[i])
if(t !== undefined) { if(t !== undefined) {
results.push.apply(results,t); results.push.apply(results,t);
} }
@@ -231,7 +231,7 @@ function getItemAtIndex(item,index) {
return item[index]; return item[index];
} else if(Array.isArray(item)) { } else if(Array.isArray(item)) {
index = $tw.utils.parseInt(index); index = $tw.utils.parseInt(index);
if(index < 0) { index = index + item.length; }; if(index < 0) { index = index + item.length };
return item[index]; // Will be undefined if index was out-of-bounds return item[index]; // Will be undefined if index was out-of-bounds
} else { } else {
return undefined; return undefined;
@@ -289,7 +289,7 @@ function setDataItem(data,indexes,value) {
var lastIndex = indexes[indexes.length - 1]; var lastIndex = indexes[indexes.length - 1];
if(Array.isArray(current)) { if(Array.isArray(current)) {
lastIndex = $tw.utils.parseInt(lastIndex); lastIndex = $tw.utils.parseInt(lastIndex);
if(lastIndex < 0) { lastIndex = lastIndex + current.length; }; if(lastIndex < 0) { lastIndex = lastIndex + current.length };
} }
// Only set indexes on objects and arrays // Only set indexes on objects and arrays
if(typeof current === "object") { if(typeof current === "object") {
@@ -316,7 +316,7 @@ function deleteDataItem(data,indexes) {
var lastIndex = indexes[indexes.length - 1]; var lastIndex = indexes[indexes.length - 1];
if(Array.isArray(current) && current !== null) { if(Array.isArray(current) && current !== null) {
lastIndex = $tw.utils.parseInt(lastIndex); lastIndex = $tw.utils.parseInt(lastIndex);
if(lastIndex < 0) { lastIndex = lastIndex + current.length; }; if(lastIndex < 0) { lastIndex = lastIndex + current.length };
// Check if index is valid before splicing // Check if index is valid before splicing
if(lastIndex >= 0 && lastIndex < current.length) { if(lastIndex >= 0 && lastIndex < current.length) {
current.splice(lastIndex,1); current.splice(lastIndex,1);
+1 -1
View File
@@ -25,7 +25,7 @@ exports.lookup = function(source,operator,options) {
indexSuffix = (suffixes[1] && suffixes[1][0] === "index") ? true : false, indexSuffix = (suffixes[1] && suffixes[1][0] === "index") ? true : false,
target; target;
if(operator.operands.length == 2) { if(operator.operands.length == 2) {
target = operator.operands[1]; target = operator.operands[1]
} else { } else {
target = indexSuffix ? "0": "text"; target = indexSuffix ? "0": "text";
} }
+23 -23
View File
@@ -17,35 +17,35 @@ Note that strings are converted to numbers automatically. Trailing non-digits ar
"use strict"; "use strict";
exports.negate = makeNumericBinaryOperator( exports.negate = makeNumericBinaryOperator(
function(a) {return -a;} function(a) {return -a}
); );
exports.abs = makeNumericBinaryOperator( exports.abs = makeNumericBinaryOperator(
function(a) {return Math.abs(a);} function(a) {return Math.abs(a)}
); );
exports.ceil = makeNumericBinaryOperator( exports.ceil = makeNumericBinaryOperator(
function(a) {return Math.ceil(a);} function(a) {return Math.ceil(a)}
); );
exports.floor = makeNumericBinaryOperator( exports.floor = makeNumericBinaryOperator(
function(a) {return Math.floor(a);} function(a) {return Math.floor(a)}
); );
exports.round = makeNumericBinaryOperator( exports.round = makeNumericBinaryOperator(
function(a) {return Math.round(a);} function(a) {return Math.round(a)}
); );
exports.trunc = makeNumericBinaryOperator( exports.trunc = makeNumericBinaryOperator(
function(a) {return Math.trunc(a);} function(a) {return Math.trunc(a)}
); );
exports.untrunc = makeNumericBinaryOperator( exports.untrunc = makeNumericBinaryOperator(
function(a) {return Math.ceil(Math.abs(a)) * Math.sign(a);} function(a) {return Math.ceil(Math.abs(a)) * Math.sign(a)}
); );
exports.sign = makeNumericBinaryOperator( exports.sign = makeNumericBinaryOperator(
function(a) {return Math.sign(a);} function(a) {return Math.sign(a)}
); );
exports.add = makeNumericBinaryOperator( exports.add = makeNumericBinaryOperator(
@@ -103,29 +103,29 @@ exports.log = makeNumericBinaryOperator(
); );
exports.sum = makeNumericReducingOperator( exports.sum = makeNumericReducingOperator(
function(accumulator,value) {return accumulator + value;}, function(accumulator,value) {return accumulator + value},
0 // Initial value 0 // Initial value
); );
exports.product = makeNumericReducingOperator( exports.product = makeNumericReducingOperator(
function(accumulator,value) {return accumulator * value;}, function(accumulator,value) {return accumulator * value},
1 // Initial value 1 // Initial value
); );
exports.maxall = makeNumericReducingOperator( exports.maxall = makeNumericReducingOperator(
function(accumulator,value) {return Math.max(accumulator,value);}, function(accumulator,value) {return Math.max(accumulator,value)},
-Infinity // Initial value -Infinity // Initial value
); );
exports.minall = makeNumericReducingOperator( exports.minall = makeNumericReducingOperator(
function(accumulator,value) {return Math.min(accumulator,value);}, function(accumulator,value) {return Math.min(accumulator,value)},
Infinity // Initial value Infinity // Initial value
); );
exports.median = makeNumericArrayOperator( exports.median = makeNumericArrayOperator(
function(values) { function(values) {
var len = values.length, median; var len = values.length, median;
values.sort(function(a,b) {return a-b;}); values.sort(function(a,b) {return a-b});
if(len % 2) { if(len % 2) {
// Odd, return the middle number // Odd, return the middle number
median = values[(len - 1) / 2]; median = values[(len - 1) / 2];
@@ -138,7 +138,7 @@ exports.median = makeNumericArrayOperator(
); );
exports.average = makeNumericReducingOperator( exports.average = makeNumericReducingOperator(
function(accumulator,value) {return accumulator + value;}, function(accumulator,value) {return accumulator + value},
0, // Initial value 0, // Initial value
function(finalValue,numberOfValues) { function(finalValue,numberOfValues) {
return finalValue/numberOfValues; return finalValue/numberOfValues;
@@ -146,7 +146,7 @@ exports.average = makeNumericReducingOperator(
); );
exports.variance = makeNumericReducingOperator( exports.variance = makeNumericReducingOperator(
function(accumulator,value) {return accumulator + value;}, function(accumulator,value) {return accumulator + value},
0, 0,
function(finalValue,numberOfValues,originalValues) { function(finalValue,numberOfValues,originalValues) {
return getVarianceFromArray(originalValues,finalValue/numberOfValues); return getVarianceFromArray(originalValues,finalValue/numberOfValues);
@@ -154,7 +154,7 @@ exports.variance = makeNumericReducingOperator(
); );
exports["standard-deviation"] = makeNumericReducingOperator( exports["standard-deviation"] = makeNumericReducingOperator(
function(accumulator,value) {return accumulator + value;}, function(accumulator,value) {return accumulator + value},
0, 0,
function(finalValue,numberOfValues,originalValues) { function(finalValue,numberOfValues,originalValues) {
var variance = getVarianceFromArray(originalValues,finalValue/numberOfValues); var variance = getVarianceFromArray(originalValues,finalValue/numberOfValues);
@@ -164,31 +164,31 @@ exports["standard-deviation"] = makeNumericReducingOperator(
//trigonometry //trigonometry
exports.cos = makeNumericBinaryOperator( exports.cos = makeNumericBinaryOperator(
function(a) {return Math.cos(a);} function(a) {return Math.cos(a)}
); );
exports.sin = makeNumericBinaryOperator( exports.sin = makeNumericBinaryOperator(
function(a) {return Math.sin(a);} function(a) {return Math.sin(a)}
); );
exports.tan = makeNumericBinaryOperator( exports.tan = makeNumericBinaryOperator(
function(a) {return Math.tan(a);} function(a) {return Math.tan(a)}
); );
exports.acos = makeNumericBinaryOperator( exports.acos = makeNumericBinaryOperator(
function(a) {return Math.acos(a);} function(a) {return Math.acos(a)}
); );
exports.asin = makeNumericBinaryOperator( exports.asin = makeNumericBinaryOperator(
function(a) {return Math.asin(a);} function(a) {return Math.asin(a)}
); );
exports.atan = makeNumericBinaryOperator( exports.atan = makeNumericBinaryOperator(
function(a) {return Math.atan(a);} function(a) {return Math.atan(a)}
); );
exports.atan2 = makeNumericBinaryOperator( exports.atan2 = makeNumericBinaryOperator(
function(a,b) {return Math.atan2(a,b);} function(a,b) {return Math.atan2(a,b)}
); );
//Calculate the variance of a population of numbers in an array given its mean //Calculate the variance of a population of numbers in an array given its mean
+5 -5
View File
@@ -14,31 +14,31 @@ Export our filter function
*/ */
exports.sort = function(source,operator,options) { exports.sort = function(source,operator,options) {
var results = prepare_results(source); var results = prepare_results(source);
options.wiki.sortTiddlers(results,operator.operand || "title",operator.prefix === "!",false,false); options.wiki.sortTiddlers(results,operator.operands[0] || "title",operator.prefix === "!",false,false,undefined,operator.operands[1]);
return results; return results;
}; };
exports.nsort = function(source,operator,options) { exports.nsort = function(source,operator,options) {
var results = prepare_results(source); var results = prepare_results(source);
options.wiki.sortTiddlers(results,operator.operand || "title",operator.prefix === "!",false,true); options.wiki.sortTiddlers(results,operator.operands[0] || "title",operator.prefix === "!",false,true,undefined,operator.operands[1]);
return results; return results;
}; };
exports.sortan = function(source, operator, options) { exports.sortan = function(source, operator, options) {
var results = prepare_results(source); var results = prepare_results(source);
options.wiki.sortTiddlers(results, operator.operand || "title", operator.prefix === "!",false,false,true); options.wiki.sortTiddlers(results, operator.operands[0] || "title", operator.prefix === "!",false,false,true,operator.operands[1]);
return results; return results;
}; };
exports.sortcs = function(source,operator,options) { exports.sortcs = function(source,operator,options) {
var results = prepare_results(source); var results = prepare_results(source);
options.wiki.sortTiddlers(results,operator.operand || "title",operator.prefix === "!",true,false); options.wiki.sortTiddlers(results,operator.operands[0] || "title",operator.prefix === "!",true,false,undefined,operator.operands[1]);
return results; return results;
}; };
exports.nsortcs = function(source,operator,options) { exports.nsortcs = function(source,operator,options) {
var results = prepare_results(source); var results = prepare_results(source);
options.wiki.sortTiddlers(results,operator.operand || "title",operator.prefix === "!",true,true); options.wiki.sortTiddlers(results,operator.operands[0] || "title",operator.prefix === "!",true,true,undefined,operator.operands[1]);
return results; return results;
}; };
-15
View File
@@ -13,21 +13,6 @@ Filter operator returning all the tags of the selected tiddlers
Export our filter function Export our filter function
*/ */
exports.tags = function(source,operator,options) { exports.tags = function(source,operator,options) {
// Fast path: cache result when iterating all tiddlers
if(source === options.wiki.each) {
return options.wiki.getGlobalCache("filter-tags-all-tiddlers",function() {
var tags = {};
source(function(tiddler,title) {
var t, length;
if(tiddler && tiddler.fields.tags) {
for(t=0, length=tiddler.fields.tags.length; t<length; t++) {
tags[tiddler.fields.tags[t]] = true;
}
}
});
return Object.keys(tags);
});
}
var tags = {}; var tags = {};
source(function(tiddler,title) { source(function(tiddler,title) {
var t, length; var t, length;
+3 -3
View File
@@ -209,14 +209,14 @@ var cycleValueInArray = function(results,operands,stepSize) {
results.push(operands[0]); results.push(operands[0]);
} }
return results; return results;
}; }
/* /*
Toggles an item in the current list. Toggles an item in the current list.
*/ */
exports.toggle = function(source,operator) { exports.toggle = function(source,operator) {
return cycleValueInArray(prepare_results(source),operator.operands); return cycleValueInArray(prepare_results(source),operator.operands);
}; }
exports.cycle = function(source,operator) { exports.cycle = function(source,operator) {
var results = prepare_results(source), var results = prepare_results(source),
@@ -227,4 +227,4 @@ exports.cycle = function(source,operator) {
step = Math.abs(step); step = Math.abs(step);
} }
return cycleValueInArray(results,operands,step); return cycleValueInArray(results,operands,step);
}; }
+6 -6
View File
@@ -46,7 +46,7 @@ function BackSubIndexer(indexer,extractor) {
BackSubIndexer.prototype.init = function() { BackSubIndexer.prototype.init = function() {
// lazy init until first lookup // lazy init until first lookup
this.index = null; this.index = null;
}; }
BackSubIndexer.prototype._init = function() { BackSubIndexer.prototype._init = function() {
this.index = Object.create(null); this.index = Object.create(null);
@@ -60,11 +60,11 @@ BackSubIndexer.prototype._init = function() {
self.index[target][sourceTitle] = true; self.index[target][sourceTitle] = true;
}); });
}); });
}; }
BackSubIndexer.prototype.rebuild = function() { BackSubIndexer.prototype.rebuild = function() {
this.index = null; this.index = null;
}; }
/* /*
* Get things that is being referenced in the text, e.g. tiddler names in the link syntax. * Get things that is being referenced in the text, e.g. tiddler names in the link syntax.
@@ -78,7 +78,7 @@ BackSubIndexer.prototype._getTarget = function(tiddler) {
return this.wiki[this.extractor](parser.tree, tiddler.fields.title); return this.wiki[this.extractor](parser.tree, tiddler.fields.title);
} }
return []; return [];
}; }
BackSubIndexer.prototype.update = function(updateDescriptor) { BackSubIndexer.prototype.update = function(updateDescriptor) {
// lazy init/update until first lookup // lazy init/update until first lookup
@@ -106,7 +106,7 @@ BackSubIndexer.prototype.update = function(updateDescriptor) {
} }
self.index[target][updateDescriptor.new.tiddler.fields.title] = true; self.index[target][updateDescriptor.new.tiddler.fields.title] = true;
}); });
}; }
BackSubIndexer.prototype.lookup = function(title) { BackSubIndexer.prototype.lookup = function(title) {
if(!this.index) { if(!this.index) {
@@ -117,6 +117,6 @@ BackSubIndexer.prototype.lookup = function(title) {
} else { } else {
return []; return [];
} }
}; }
exports.BackIndexer = BackIndexer; exports.BackIndexer = BackIndexer;
+3 -3
View File
@@ -19,7 +19,7 @@ FieldIndexer.prototype.init = function() {
this.index = null; this.index = null;
this.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH; this.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH;
this.addIndexMethods(); this.addIndexMethods();
}; }
// Provided for testing // Provided for testing
FieldIndexer.prototype.setMaxIndexedValueLength = function(length) { FieldIndexer.prototype.setMaxIndexedValueLength = function(length) {
@@ -33,14 +33,14 @@ FieldIndexer.prototype.addIndexMethods = function() {
this.wiki.each.byField = function(name,value) { this.wiki.each.byField = function(name,value) {
var lookup = self.lookup(name,value); var lookup = self.lookup(name,value);
return lookup && lookup.filter(function(title) { return lookup && lookup.filter(function(title) {
return self.wiki.tiddlerExists(title); return self.wiki.tiddlerExists(title)
}); });
}; };
// get shadow tiddlers, including shadow tiddlers that is overwritten // get shadow tiddlers, including shadow tiddlers that is overwritten
this.wiki.eachShadow.byField = function(name,value) { this.wiki.eachShadow.byField = function(name,value) {
var lookup = self.lookup(name,value); var lookup = self.lookup(name,value);
return lookup && lookup.filter(function(title) { return lookup && lookup.filter(function(title) {
return self.wiki.isShadowTiddler(title); return self.wiki.isShadowTiddler(title)
}); });
}; };
this.wiki.eachTiddlerPlusShadows.byField = function(name,value) { this.wiki.eachTiddlerPlusShadows.byField = function(name,value) {
+1 -51
View File
@@ -67,57 +67,7 @@ TagSubIndexer.prototype.rebuild = function() {
}; };
TagSubIndexer.prototype.update = function(updateDescriptor) { TagSubIndexer.prototype.update = function(updateDescriptor) {
// If the index hasn't been built yet, no update needed this.index = null;
if(this.index === null) {
return;
}
// Determine whether the old/new tiddler is visible to this iterator
var oldVisible = this._isVisible(updateDescriptor.old),
newVisible = this._isVisible(updateDescriptor["new"]),
self = this;
// Remove old tags from index
if(oldVisible && updateDescriptor.old.tiddler) {
var oldTitle = updateDescriptor.old.tiddler.fields.title,
oldTags = updateDescriptor.old.tiddler.fields.tags || [];
$tw.utils.each(oldTags,function(tag) {
if(self.index[tag]) {
var idx = self.index[tag].titles.indexOf(oldTitle);
if(idx !== -1) {
self.index[tag].titles.splice(idx,1);
if(self.index[tag].titles.length === 0) {
delete self.index[tag];
}
}
}
});
}
// Add new tags to index
if(newVisible && updateDescriptor["new"].tiddler) {
var newTitle = updateDescriptor["new"].tiddler.fields.title,
newTags = updateDescriptor["new"].tiddler.fields.tags || [];
$tw.utils.each(newTags,function(tag) {
if(!self.index[tag]) {
self.index[tag] = {isSorted: false, titles: [newTitle]};
} else if(self.index[tag].titles.indexOf(newTitle) === -1) {
self.index[tag].titles.push(newTitle);
self.index[tag].isSorted = false;
}
});
}
};
/*
Determine whether a tiddler described by a descriptor is visible to this sub-indexer's iterator
*/
TagSubIndexer.prototype._isVisible = function(descriptor) {
if(this.iteratorMethod === "each") {
return descriptor.exists;
} else if(this.iteratorMethod === "eachShadow") {
return descriptor.shadow;
} else {
// eachTiddlerPlusShadows and eachShadowPlusTiddlers both visit all tiddlers and shadows
return descriptor.exists || descriptor.shadow;
}
}; };
TagSubIndexer.prototype.lookup = function(tag) { TagSubIndexer.prototype.lookup = function(tag) {
+6 -6
View File
@@ -14,12 +14,12 @@ exports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) {
this.updateCallback = updateCallback; this.updateCallback = updateCallback;
this.resizeHandlers = new Map(); this.resizeHandlers = new Map();
this.dimensionsInfo = [ this.dimensionsInfo = [
["outer/width", (win) => win.outerWidth], ["outer/width", win => win.outerWidth],
["outer/height", (win) => win.outerHeight], ["outer/height", win => win.outerHeight],
["inner/width", (win) => win.innerWidth], ["inner/width", win => win.innerWidth],
["inner/height", (win) => win.innerHeight], ["inner/height", win => win.innerHeight],
["client/width", (win) => win.document.documentElement.clientWidth], ["client/width", win => win.document.documentElement.clientWidth],
["client/height", (win) => win.document.documentElement.clientHeight] ["client/height", win => win.document.documentElement.clientHeight]
]; ];
} }
+5 -4
View File
@@ -140,7 +140,7 @@ function KeyboardManager(options) {
this.shortcutParsedList = []; // Stores the parsed key descriptors this.shortcutParsedList = []; // Stores the parsed key descriptors
this.shortcutPriorityList = []; // Stores the parsed shortcut priority this.shortcutPriorityList = []; // Stores the parsed shortcut priority
this.lookupNames = ["shortcuts"]; this.lookupNames = ["shortcuts"];
this.lookupNames.push($tw.platform.isMac ? "shortcuts-mac" : "shortcuts-not-mac"); this.lookupNames.push($tw.platform.isMac ? "shortcuts-mac" : "shortcuts-not-mac")
this.lookupNames.push($tw.platform.isWindows ? "shortcuts-windows" : "shortcuts-not-windows"); this.lookupNames.push($tw.platform.isWindows ? "shortcuts-windows" : "shortcuts-not-windows");
this.lookupNames.push($tw.platform.isLinux ? "shortcuts-linux" : "shortcuts-not-linux"); this.lookupNames.push($tw.platform.isLinux ? "shortcuts-linux" : "shortcuts-not-linux");
this.updateShortcutLists(this.getShortcutTiddlerList()); this.updateShortcutLists(this.getShortcutTiddlerList());
@@ -161,7 +161,7 @@ KeyboardManager.prototype.getModifierKeys = function() {
91, // Meta (left) 91, // Meta (left)
93, // Meta (right) 93, // Meta (right)
224 // Meta (Firefox) 224 // Meta (Firefox)
]; ]
}; };
/* /*
@@ -187,7 +187,8 @@ KeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor,options) {
metaKey: false metaKey: false
}; };
for(var t=0; t<components.length; t++) { for(var t=0; t<components.length; t++) {
var s = components[t].toLowerCase(); var s = components[t].toLowerCase(),
c = s.charCodeAt(0);
// Look for modifier keys // Look for modifier keys
if(s === "ctrl") { if(s === "ctrl") {
info.ctrlKey = true; info.ctrlKey = true;
@@ -265,7 +266,7 @@ KeyboardManager.prototype.getPrintableShortcuts = function(keyInfoArray) {
} }
}); });
return result; return result;
}; }
KeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) { KeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) {
return keyInfo && return keyInfo &&
+4 -3
View File
@@ -24,7 +24,8 @@ exports.params = [
Run the macro Run the macro
*/ */
exports.run = function(filter,format) { exports.run = function(filter,format) {
var tiddlers = this.wiki.filterTiddlers(filter), var self = this,
tiddlers = this.wiki.filterTiddlers(filter),
tiddler, tiddler,
fields = [], fields = [],
t,f; t,f;
@@ -45,13 +46,13 @@ exports.run = function(filter,format) {
var p = fields.indexOf(value); var p = fields.indexOf(value);
if(p !== -1) { if(p !== -1) {
fields.splice(p,1); fields.splice(p,1);
fields.unshift(value); fields.unshift(value)
} }
}); });
// Output the column headings // Output the column headings
var output = [], row = []; var output = [], row = [];
fields.forEach(function(value) { fields.forEach(function(value) {
row.push(quoteAndEscape(value)); row.push(quoteAndEscape(value))
}); });
output.push(row.join(",")); output.push(row.join(","));
// Output each tiddler // Output each tiddler
+1 -1
View File
@@ -32,7 +32,7 @@ exports.run = function(shortcuts,prefix,separator,suffix) {
if(shortcutArray.length > 0) { if(shortcutArray.length > 0) {
shortcutArray.sort(function(a,b) { shortcutArray.sort(function(a,b) {
return a.toLowerCase().localeCompare(b.toLowerCase()); return a.toLowerCase().localeCompare(b.toLowerCase());
}); })
return prefix + shortcutArray.join(separator) + suffix; return prefix + shortcutArray.join(separator) + suffix;
} else { } else {
return ""; return "";
+2
View File
@@ -7,6 +7,8 @@ The audio parser parses an audio tiddler into an embeddable HTML element
\*/ \*/
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict"; "use strict";
var AudioParser = function(type,text,options) { var AudioParser = function(type,text,options) {
+1 -1
View File
@@ -59,7 +59,7 @@ var BinaryParser = function(type,text,options) {
class: {type: "string", value: "tc-binary-warning"} class: {type: "string", value: "tc-binary-warning"}
}, },
children: [warn, link] children: [warn, link]
}; }
this.tree = [element]; this.tree = [element];
this.source = text; this.source = text;
this.type = type; this.type = type;
+1 -1
View File
@@ -45,7 +45,7 @@ var CsvParser = function(type,text,options) {
row.children.push({ row.children.push({
"type": "element", "tag": tag, "children": [{ "type": "element", "tag": tag, "children": [{
"type": "text", "type": "text",
"text": columns[column] || "" "text": columns[column] || ''
}] }]
}); });
} }
+31 -56
View File
@@ -45,7 +45,7 @@ exports.parseWhiteSpace = function(source,pos) {
type: "whitespace", type: "whitespace",
start: pos, start: pos,
end: p end: p
}; }
} }
}; };
@@ -107,7 +107,7 @@ exports.parseStringLiteral = function(source,pos) {
type: "string", type: "string",
start: pos start: pos
}; };
var reString = /(?:"""([\s\S]*?)"""|"([^"]*)")|(?:'([^']*)')|\[\[((?:[^\]]|\](?!\]))*)\]\]/y; var reString = /(?:"""([\s\S]*?)"""|"([^"]*)")|(?:'([^']*)')|\[\[((?:[^\]]|\](?!\]))*)\]\]/g;
reString.lastIndex = pos; reString.lastIndex = pos;
var match = reString.exec(source); var match = reString.exec(source);
if(match && match.index === pos) { if(match && match.index === pos) {
@@ -170,7 +170,7 @@ exports.parseMacroParameters = function(node,source,pos) {
} }
node.end = pos; node.end = pos;
return node; return node;
}; }
/* /*
Look for a macro invocation parameter. Returns null if not found, or {type: "macro-parameter", name:, value:, start:, end:} Look for a macro invocation parameter. Returns null if not found, or {type: "macro-parameter", name:, value:, start:, end:}
@@ -221,7 +221,7 @@ exports.parseMacroInvocationAsTransclusion = function(source,pos) {
orderedAttributes: [] orderedAttributes: []
}; };
// Define our regexps // Define our regexps
var reVarName = /([^\s>"'=:]+)/y; var reVarName = /([^\s>"'=:]+)/g;
// Skip whitespace // Skip whitespace
pos = $tw.utils.skipWhiteSpace(source,pos); pos = $tw.utils.skipWhiteSpace(source,pos);
// Look for a double opening angle bracket // Look for a double opening angle bracket
@@ -237,12 +237,10 @@ exports.parseMacroInvocationAsTransclusion = function(source,pos) {
} }
$tw.utils.addAttributeToParseTreeNode(node,"$variable",token.match[1]); $tw.utils.addAttributeToParseTreeNode(node,"$variable",token.match[1]);
pos = token.end; pos = token.end;
// Check that the tag is terminated by a space or >>, and that there is a closing >> somewhere ahead // Check that the tag is terminated by a space or >>
if(!(source.charAt(pos) === ">" && source.charAt(pos + 1) === ">") ) { if(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === ">" && source.charAt(pos + 1) === ">") ) {
if(source.indexOf(">>",pos) === -1) {
return null; return null;
} }
}
// Process attributes // Process attributes
pos = $tw.utils.parseMacroParametersAsAttributes(node,source,pos); pos = $tw.utils.parseMacroParametersAsAttributes(node,source,pos);
// Skip whitespace // Skip whitespace
@@ -269,7 +267,7 @@ exports.parseMVVReferenceAsTransclusion = function(source,pos) {
orderedAttributes: [] orderedAttributes: []
}; };
// Define our regexps // Define our regexps
var reVarName = /([^\s>"'=:)]+)/y; var reVarName = /([^\s>"'=:)]+)/g;
// Skip whitespace // Skip whitespace
pos = $tw.utils.skipWhiteSpace(source,pos); pos = $tw.utils.skipWhiteSpace(source,pos);
// Look for a double opening parenthesis // Look for a double opening parenthesis
@@ -325,24 +323,18 @@ exports.parseMacroParameterAsAttribute = function(source,pos) {
start: pos start: pos
}; };
// Define our regexps // Define our regexps
var reAttributeName = /([^\/\s>"'`=:]+)/y, var reAttributeName = /([^\/\s>"'`=:]+)/g,
reStrictIdentifier = /^[A-Za-z0-9\-_]+$/, reUnquotedAttribute = /((?:(?:>(?!>))|[^\s>"'])+)/g,
reUnquotedAttribute = /(?!<<)((?:(?:>(?!>))|[^\s>"'])+)/y, reFilteredValue = /\{\{\{([\S\s]+?)\}\}\}/g,
reFilteredValue = /\{\{\{([\S\s]+?)\}\}\}/y, reIndirectValue = /\{\{([^\}]+)\}\}/g,
reIndirectValue = /\{\{([^\}]+)\}\}/y, reSubstitutedValue = /(?:```([\s\S]*?)```|`([^`]|[\S\s]*?)`)/g;
reSubstitutedValue = /(?:```([\s\S]*?)```|`([^`]|[\S\s]*?)`)/y;
// Skip whitespace // Skip whitespace
pos = $tw.utils.skipWhiteSpace(source,pos); pos = $tw.utils.skipWhiteSpace(source,pos);
// Get the attribute name and the separator token // Get the attribute name and the separator token
var nameToken = $tw.utils.parseTokenRegExp(source,pos,reAttributeName), var nameToken = $tw.utils.parseTokenRegExp(source,pos,reAttributeName),
namePos = nameToken && $tw.utils.skipWhiteSpace(source,nameToken.end), namePos = nameToken && $tw.utils.skipWhiteSpace(source,nameToken.end),
separatorToken = nameToken && $tw.utils.parseTokenRegExp(source,namePos,/=|:/y), separatorToken = nameToken && $tw.utils.parseTokenRegExp(source,namePos,/=|:/g),
isNewStyleSeparator = false; // If there is no separator then we don't allow new style values isNewStyleSeparator = false; // If there is no separator then we don't allow new style values
// Colon separator requires a strict identifier name to avoid mis-parsing values like $:/foo
if(nameToken && separatorToken && separatorToken.match[0] === ":" && !reStrictIdentifier.test(nameToken.match[1])) {
nameToken = null;
separatorToken = null;
}
// If we have a name and a separator then we have a named attribute // If we have a name and a separator then we have a named attribute
if(nameToken && separatorToken) { if(nameToken && separatorToken) {
node.name = nameToken.match[1]; node.name = nameToken.match[1];
@@ -353,8 +345,6 @@ exports.parseMacroParameterAsAttribute = function(source,pos) {
} }
// Skip whitespace // Skip whitespace
pos = $tw.utils.skipWhiteSpace(source,pos); pos = $tw.utils.skipWhiteSpace(source,pos);
do {
// Look for a string literal // Look for a string literal
var stringLiteral = $tw.utils.parseStringLiteral(source,pos); var stringLiteral = $tw.utils.parseStringLiteral(source,pos);
if(stringLiteral) { if(stringLiteral) {
@@ -363,68 +353,56 @@ exports.parseMacroParameterAsAttribute = function(source,pos) {
node.value = stringLiteral.value; node.value = stringLiteral.value;
// Mark the value as having been quoted in the source // Mark the value as having been quoted in the source
node.quoted = true; node.quoted = true;
break; } else {
}
if(isNewStyleSeparator) {
// Look for a filtered value // Look for a filtered value
var filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue); var filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);
if(filteredValue) { if(filteredValue && isNewStyleSeparator) {
pos = filteredValue.end; pos = filteredValue.end;
node.type = "filtered"; node.type = "filtered";
node.filter = filteredValue.match[1]; node.filter = filteredValue.match[1];
break; } else {
}
// Look for an indirect value // Look for an indirect value
var indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue); var indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);
if(indirectValue) { if(indirectValue && isNewStyleSeparator) {
pos = indirectValue.end; pos = indirectValue.end;
node.type = "indirect"; node.type = "indirect";
node.textReference = indirectValue.match[1]; node.textReference = indirectValue.match[1];
break; } else {
}
// Look for a macro invocation value // Look for a macro invocation value
var macroInvocation = $tw.utils.parseMacroInvocationAsTransclusion(source,pos); var macroInvocation = $tw.utils.parseMacroInvocationAsTransclusion(source,pos);
if(macroInvocation) { if(macroInvocation && isNewStyleSeparator) {
pos = macroInvocation.end; pos = macroInvocation.end;
node.type = "macro"; node.type = "macro";
node.value = macroInvocation; node.value = macroInvocation;
break; } else {
}
// Look for an MVV reference value // Look for an MVV reference value
var mvvReference = $tw.utils.parseMVVReferenceAsTransclusion(source,pos); var mvvReference = $tw.utils.parseMVVReferenceAsTransclusion(source,pos);
if(mvvReference) { if(mvvReference && isNewStyleSeparator) {
pos = mvvReference.end; pos = mvvReference.end;
node.type = "macro"; node.type = "macro";
node.value = mvvReference; node.value = mvvReference;
node.isMVV = true; node.isMVV = true;
break; } else {
}
// Look for a substituted value
var substitutedValue = $tw.utils.parseTokenRegExp(source,pos,reSubstitutedValue); var substitutedValue = $tw.utils.parseTokenRegExp(source,pos,reSubstitutedValue);
if(substitutedValue) { if(substitutedValue && isNewStyleSeparator) {
pos = substitutedValue.end; pos = substitutedValue.end;
node.type = "substituted"; node.type = "substituted";
node.rawValue = substitutedValue.match[1] || substitutedValue.match[2]; node.rawValue = substitutedValue.match[1] || substitutedValue.match[2];
break; } else {
}
}
// Look for a unquoted value // Look for a unquoted value
var unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute); var unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);
if(unquotedValue) { if(unquotedValue) {
pos = unquotedValue.end; pos = unquotedValue.end;
node.type = "string"; node.type = "string";
node.value = unquotedValue.match[1]; node.value = unquotedValue.match[1];
break; // redundant, but leaving for consistency } else {
}
}
}
}
}
}
} }
} while(false);
// Bail if we don't have a value // Bail if we don't have a value
if(!node.type) { if(!node.type) {
return null; return null;
@@ -576,9 +554,6 @@ exports.parseAttribute = function(source,pos) {
pos = unquotedValue.end; pos = unquotedValue.end;
node.type = "string"; node.type = "string";
node.value = unquotedValue.match[1]; node.value = unquotedValue.match[1];
} else if(source.charAt(pos) === "<" && source.charAt(pos + 1) === "<" && source.indexOf(">>",pos) !== -1) {
// Value looks like a macro invocation (starts with << with a closing >> ahead) but does not parse as one. Return null so the enclosing tag fails to parse rather than silently binding the attribute to "true" and treating the remainder as further attributes (restores v5.3.8 behaviour)
return null;
} else { } else {
node.type = "string"; node.type = "string";
node.value = "true"; node.value = "true";
+2 -1
View File
@@ -14,7 +14,8 @@ var ImageParser = function(type,text,options) {
type: "element", type: "element",
tag: "iframe", tag: "iframe",
attributes: {} attributes: {}
}; },
src;
if(options._canonical_uri) { if(options._canonical_uri) {
element.attributes.src = {type: "string", value: options._canonical_uri}; element.attributes.src = {type: "string", value: options._canonical_uri};
} else if(text) { } else if(text) {
+2 -1
View File
@@ -17,7 +17,8 @@ var VideoParser = function(type,text,options) {
controls: {type: "string", value: "controls"}, controls: {type: "string", value: "controls"},
style: {type: "string", value: "width: 100%; object-fit: contain"} style: {type: "string", value: "width: 100%; object-fit: contain"}
} }
}; },
src;
if(options._canonical_uri) { if(options._canonical_uri) {
element.attributes.src = {type: "string", value: options._canonical_uri}; element.attributes.src = {type: "string", value: options._canonical_uri};
} else if(text) { } else if(text) {
@@ -26,6 +26,8 @@ exports.init = function(parser) {
Parse the most recent match Parse the most recent match
*/ */
exports.parse = function() { exports.parse = function() {
// Get all the details of the match
var entityString = this.match[1];
// Move past the macro call // Move past the macro call
this.parser.pos = this.matchRegExp.lastIndex; this.parser.pos = this.matchRegExp.lastIndex;
// Return the entity // Return the entity
@@ -29,6 +29,7 @@ exports.init = function(parser) {
Parse the most recent match Parse the most recent match
*/ */
exports.parse = function() { exports.parse = function() {
var self = this;
// Move past the pragma invocation // Move past the pragma invocation
this.parser.pos = this.matchRegExp.lastIndex; this.parser.pos = this.matchRegExp.lastIndex;
// Parse the filter terminated by a line break // Parse the filter terminated by a line break
@@ -93,7 +93,7 @@ exports.parseLink = function(source,pos) {
splitPos = null; splitPos = null;
} }
// Pull out the tooltip and URL // Pull out the tooltip and URL
var URL, urlStart; var tooltip, URL, urlStart;
textNode.start = pos; textNode.start = pos;
if(splitPos) { if(splitPos) {
urlStart = splitPos + 1; urlStart = splitPos + 1;
@@ -67,5 +67,5 @@ exports.parse = function() {
return [{ return [{
type: "void", type: "void",
children: tree children: tree
}]; }]
}; };
@@ -42,7 +42,7 @@ exports.parse = function() {
name: name, name: name,
type: "string", type: "string",
value: paramValue value: paramValue
}; }
}); });
// Prepare the tiddler widget // Prepare the tiddler widget
var tr, targetTitle, targetField, targetIndex, tiddlerNode; var tr, targetTitle, targetField, targetIndex, tiddlerNode;
@@ -41,7 +41,7 @@ exports.parse = function() {
name: name, name: name,
type: "string", type: "string",
value: paramValue value: paramValue
}; }
}); });
// Prepare the tiddler widget // Prepare the tiddler widget
var tr, targetTitle, targetField, targetIndex, tiddlerNode; var tr, targetTitle, targetField, targetIndex, tiddlerNode;
@@ -25,6 +25,8 @@ $$$
"use strict"; "use strict";
var widget = require("$:/core/modules/widgets/widget.js");
exports.name = "typedblock"; exports.name = "typedblock";
exports.types = {block: true}; exports.types = {block: true};
+5 -4
View File
@@ -49,7 +49,8 @@ PluginSwitcher.prototype.switchPlugins = function() {
var tiddler = self.wiki.getTiddler(title); var tiddler = self.wiki.getTiddler(title);
if(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) { if(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {
plugins.push(title); plugins.push(title);
var dependents = $tw.utils.parseStringArray(tiddler.fields.dependents || ""); var pluginInfo = $tw.utils.parseJSONSafe(self.wiki.getTiddlerText(title)),
dependents = $tw.utils.parseStringArray(tiddler.fields.dependents || "");
$tw.utils.each(dependents,function(title) { $tw.utils.each(dependents,function(title) {
accumulatePlugin(title); accumulatePlugin(title);
}); });
@@ -57,11 +58,11 @@ PluginSwitcher.prototype.switchPlugins = function() {
}; };
accumulatePlugin(selectedPluginTitle); accumulatePlugin(selectedPluginTitle);
// Read the plugin info for the incoming plugins // Read the plugin info for the incoming plugins
$tw.wiki.readPluginInfo(plugins); var changes = $tw.wiki.readPluginInfo(plugins);
// Unregister any existing theme tiddlers // Unregister any existing theme tiddlers
$tw.wiki.unregisterPluginTiddlers(this.pluginType); var unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);
// Register any new theme tiddlers // Register any new theme tiddlers
$tw.wiki.registerPluginTiddlers(this.pluginType,plugins); var registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);
// Unpack the current theme tiddlers // Unpack the current theme tiddlers
$tw.wiki.unpackPluginTiddlers(); $tw.wiki.unpackPluginTiddlers();
// Call the switch handler // Call the switch handler
-54
View File
@@ -1,54 +0,0 @@
/*\
title: $:/core/modules/relinkers/tiddlers.js
type: application/javascript
module-type: relinker
Relinks the tags and list fields of tiddlers.
Calls a tw-relinking-tiddler hook for every altered tiddler.
\*/
exports.name = "tiddlers";
exports.relink = function(wiki,fromTitle,toTitle,options) {
wiki.each(function(tiddler,title) {
var type = tiddler.fields.type || "";
// Don't touch plugins or JavaScript modules
if(!tiddler.fields["plugin-type"] && type !== "application/javascript") {
var tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,
list = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,
isModified = false,
processList = function(listField) {
if(listField && listField.indexOf(fromTitle) !== -1) {
// Remove any existing instances of the toTitle
var p = listField.indexOf(toTitle);
while(p !== -1) {
listField.splice(p,1);
p = listField.indexOf(toTitle);
}
// Replace the fromTitle with toTitle
$tw.utils.each(listField,function (title,index) {
if(title === fromTitle) {
listField[index] = toTitle;
isModified = true;
}
});
}
};
if(!options.dontRenameInTags) {
// Rename tags
processList(tags);
}
if(!options.dontRenameInLists) {
// Rename lists
processList(list);
}
if(isModified) {
var newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},wiki.getModificationFields());
newTiddler = $tw.hooks.invokeHook("th-relinking-tiddler",newTiddler,tiddler);
wiki.addTiddler(newTiddler);
}
}
});
};
+1 -1
View File
@@ -22,7 +22,7 @@ var findSaver = function(window) {
console.log({ msg: "custom saver is disabled", reason: err }); console.log({ msg: "custom saver is disabled", reason: err });
return null; return null;
} }
}; }
var saver = findSaver(window) || findSaver(window.parent) || {}; var saver = findSaver(window) || findSaver(window.parent) || {};
var CustomSaver = function(wiki) { var CustomSaver = function(wiki) {
+1
View File
@@ -101,6 +101,7 @@ GiteaSaver.prototype.upload = function(uri,method,headers,data,callback) {
if(err) { if(err) {
return callback(err); return callback(err);
} }
var putResponseData = $tw.utils.parseJSONSafe(putResponseDataJson);
callback(null); callback(null);
} }
}); });
+3 -1
View File
@@ -17,7 +17,8 @@ var GitHubSaver = function(wiki) {
}; };
GitHubSaver.prototype.save = function(text,method,callback) { GitHubSaver.prototype.save = function(text,method,callback) {
var username = this.wiki.getTiddlerText("$:/GitHub/Username"), var self = this,
username = this.wiki.getTiddlerText("$:/GitHub/Username"),
password = $tw.utils.getPassword("github"), password = $tw.utils.getPassword("github"),
repo = this.wiki.getTiddlerText("$:/GitHub/Repo"), repo = this.wiki.getTiddlerText("$:/GitHub/Repo"),
path = this.wiki.getTiddlerText("$:/GitHub/Path",""), path = this.wiki.getTiddlerText("$:/GitHub/Path",""),
@@ -80,6 +81,7 @@ GitHubSaver.prototype.save = function(text,method,callback) {
if(err) { if(err) {
return callback(err); return callback(err);
} }
var putResponseData = $tw.utils.parseJSONSafe(putResponseDataJson);
callback(null); callback(null);
} }
}); });
+5 -3
View File
@@ -18,7 +18,8 @@ var GitLabSaver = function(wiki) {
GitLabSaver.prototype.save = function(text,method,callback) { GitLabSaver.prototype.save = function(text,method,callback) {
/* See https://docs.gitlab.com/ee/api/repository_files.html */ /* See https://docs.gitlab.com/ee/api/repository_files.html */
var username = this.wiki.getTiddlerText("$:/GitLab/Username"), var self = this,
username = this.wiki.getTiddlerText("$:/GitLab/Username"),
password = $tw.utils.getPassword("gitlab"), password = $tw.utils.getPassword("gitlab"),
repo = this.wiki.getTiddlerText("$:/GitLab/Repo"), repo = this.wiki.getTiddlerText("$:/GitLab/Repo"),
path = this.wiki.getTiddlerText("$:/GitLab/Path",""), path = this.wiki.getTiddlerText("$:/GitLab/Path",""),
@@ -44,7 +45,7 @@ GitLabSaver.prototype.save = function(text,method,callback) {
var uri = endpoint + "/projects/" + encodeURIComponent(repo) + "/repository/"; var uri = endpoint + "/projects/" + encodeURIComponent(repo) + "/repository/";
// Perform a get request to get the details (inc shas) of files in the same path as our file // Perform a get request to get the details (inc shas) of files in the same path as our file
$tw.utils.httpRequest({ $tw.utils.httpRequest({
url: uri + "tree/?path=" + encodeURIComponent(path.replace(/^\/+|\/$/g, "")) + "&branch=" + encodeURIComponent(branch.replace(/^\/+|\/$/g, "")), url: uri + "tree/?path=" + encodeURIComponent(path.replace(/^\/+|\/$/g, '')) + "&branch=" + encodeURIComponent(branch.replace(/^\/+|\/$/g, '')),
type: "GET", type: "GET",
headers: headers, headers: headers,
callback: function(err,getResponseDataJson,xhr) { callback: function(err,getResponseDataJson,xhr) {
@@ -70,7 +71,7 @@ GitLabSaver.prototype.save = function(text,method,callback) {
}; };
// Perform a request to save the file // Perform a request to save the file
$tw.utils.httpRequest({ $tw.utils.httpRequest({
url: uri + "files/" + encodeURIComponent(path.replace(/^\/+/, "") + filename), url: uri + "files/" + encodeURIComponent(path.replace(/^\/+/, '') + filename),
type: requestType, type: requestType,
headers: headers, headers: headers,
data: JSON.stringify(data), data: JSON.stringify(data),
@@ -78,6 +79,7 @@ GitLabSaver.prototype.save = function(text,method,callback) {
if(err) { if(err) {
return callback(err); return callback(err);
} }
var putResponseData = $tw.utils.parseJSONSafe(putResponseDataJson);
callback(null); callback(null);
} }
}); });
+1
View File
@@ -48,6 +48,7 @@ UploadSaver.prototype.save = function(text,method,callback) {
} }
// Assemble the header // Assemble the header
var boundary = "---------------------------" + "AaB03x"; var boundary = "---------------------------" + "AaB03x";
var uploadFormName = "UploadPlugin";
var head = []; var head = [];
head.push("--" + boundary + "\r\nContent-disposition: form-data; name=\"UploadPlugin\"\r\n"); head.push("--" + boundary + "\r\nContent-disposition: form-data; name=\"UploadPlugin\"\r\n");
head.push("backupDir=" + backupDir + ";user=" + username + ";password=" + password + ";uploaddir=" + uploadDir + ";;"); head.push("backupDir=" + backupDir + ";user=" + username + ";password=" + password + ";uploaddir=" + uploadDir + ";;");
+1 -1
View File
@@ -59,7 +59,7 @@ function loadIFrame(url,callback) {
Unload library iframe for given url Unload library iframe for given url
*/ */
function unloadIFrame(url){ function unloadIFrame(url){
var iframes = document.getElementsByTagName("iframe"); var iframes = document.getElementsByTagName('iframe');
for(var t=iframes.length-1; t--; t>=0) { for(var t=iframes.length-1; t--; t>=0) {
var iframe = iframes[t]; var iframe = iframes[t];
if(iframe.getAttribute("library") === "true" && if(iframe.getAttribute("library") === "true" &&
+1 -1
View File
@@ -40,7 +40,7 @@ $tw.eventBus = {
emit(event,data) { emit(event,data) {
const listeners = this.listenersMap.get(event); const listeners = this.listenersMap.get(event);
if(listeners) { if(listeners) {
listeners.forEach((fn) => fn(data)); listeners.forEach(fn => fn(data));
} }
} }
}; };
+1 -1
View File
@@ -27,7 +27,7 @@ exports.startup = function() {
faviconLink.setAttribute("href",dataURI); faviconLink.setAttribute("href",dataURI);
$tw.faviconPublisher.send({verb: "FAVICON",body: dataURI}); $tw.faviconPublisher.send({verb: "FAVICON",body: dataURI});
} }
}; }
$tw.faviconPublisher = new $tw.utils.BrowserMessagingPublisher({type: "FAVICON", onsubscribe: setFavicon}); $tw.faviconPublisher = new $tw.utils.BrowserMessagingPublisher({type: "FAVICON", onsubscribe: setFavicon});
// Set up the favicon // Set up the favicon
setFavicon(); setFavicon();
+1
View File
@@ -31,6 +31,7 @@ exports.startup = function() {
if(requiresReload) { if(requiresReload) {
requireReloadDueToPluginChange = true; requireReloadDueToPluginChange = true;
} else if(tiddler) { } else if(tiddler) {
var pluginType = tiddler.fields["plugin-type"];
if($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields["plugin-type"] || ""),"no") === "yes") { if($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields["plugin-type"] || ""),"no") === "yes") {
changesToProcess.push(title); changesToProcess.push(title);
} }
+1 -1
View File
@@ -113,7 +113,7 @@ exports.startup = function() {
$tw.syncer = new $tw.Syncer({ $tw.syncer = new $tw.Syncer({
wiki: $tw.wiki, wiki: $tw.wiki,
syncadaptor: $tw.syncadaptor, syncadaptor: $tw.syncadaptor,
logging: $tw.wiki.getTiddlerText("$:/config/SyncLogging", "yes") === "yes" logging: $tw.wiki.getTiddlerText('$:/config/SyncLogging', "yes") === "yes"
}); });
} }
// Setup the saver handler // Setup the saver handler
+1 -1
View File
@@ -104,7 +104,7 @@ exports.startup = function() {
$tw.utils.each($tw.windows,function(win) { $tw.utils.each($tw.windows,function(win) {
win.close(); win.close();
}); });
}; }
$tw.rootWidget.addEventListener("tm-close-all-windows",closeAllWindows); $tw.rootWidget.addEventListener("tm-close-all-windows",closeAllWindows);
// Close open windows when unloading main window // Close open windows when unloading main window
$tw.addUnloadTask(closeAllWindows); $tw.addUnloadTask(closeAllWindows);
+1
View File
@@ -16,6 +16,7 @@ var ClassicStoryView = function(listWidget) {
}; };
ClassicStoryView.prototype.navigateTo = function(historyInfo) { ClassicStoryView.prototype.navigateTo = function(historyInfo) {
var duration = $tw.utils.getAnimationDuration()
var listElementIndex = this.listWidget.findListItem(0,historyInfo.title); var listElementIndex = this.listWidget.findListItem(0,historyInfo.title);
if(listElementIndex === undefined) { if(listElementIndex === undefined) {
return; return;
+1 -1
View File
@@ -62,7 +62,7 @@ PopStoryView.prototype.insert = function(widget) {
]); ]);
setTimeout(function() { setTimeout(function() {
$tw.utils.removeStyles(targetElement, ["transition", "transform", "opactity"]); $tw.utils.removeStyles(targetElement, ["transition", "transform", "opactity"]);
}, duration); }, duration)
}; };
PopStoryView.prototype.remove = function(widget) { PopStoryView.prototype.remove = function(widget) {
+2 -2
View File
@@ -16,7 +16,7 @@ var ZoominListView = function(listWidget) {
this.listWidget = listWidget; this.listWidget = listWidget;
this.textNodeLogger = new $tw.utils.Logger("zoomin story river view", { this.textNodeLogger = new $tw.utils.Logger("zoomin story river view", {
enable: true, enable: true,
colour: "red" colour: 'red'
}); });
// Get the index of the tiddler that is at the top of the history // Get the index of the tiddler that is at the top of the history
var history = this.listWidget.wiki.getTiddlerDataCached(this.listWidget.historyTitle,[]), var history = this.listWidget.wiki.getTiddlerDataCached(this.listWidget.historyTitle,[]),
@@ -212,8 +212,8 @@ ZoominListView.prototype.remove = function(widget) {
]); ]);
setTimeout(function() { setTimeout(function() {
$tw.utils.removeStyles(toWidgetDomNode, ["transformOrigin", "transform", "transition", "opacity", "zIndex"]); $tw.utils.removeStyles(toWidgetDomNode, ["transformOrigin", "transform", "transition", "opacity", "zIndex"]);
removeElement();
}, duration); }, duration);
setTimeout(removeElement,duration);
// Now the tiddler we're going back to // Now the tiddler we're going back to
if(toWidgetDomNode) { if(toWidgetDomNode) {
$tw.utils.setStyle(toWidgetDomNode,[ $tw.utils.setStyle(toWidgetDomNode,[
+7 -7
View File
@@ -89,7 +89,7 @@ function Syncer(options) {
self.processTaskQueue(); self.processTaskQueue();
} else { } else {
// Look for deletions of tiddlers we're already syncing // Look for deletions of tiddlers we're already syncing
var outstandingDeletion = false; var outstandingDeletion = false
$tw.utils.each(changes,function(change,title,object) { $tw.utils.each(changes,function(change,title,object) {
if(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) { if(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) {
outstandingDeletion = true; outstandingDeletion = true;
@@ -304,7 +304,7 @@ Syncer.prototype.syncFromServer = function() {
Syncer.prototype.canSyncFromServer = function() { Syncer.prototype.canSyncFromServer = function() {
return !!this.syncadaptor.getUpdatedTiddlers || !!this.syncadaptor.getSkinnyTiddlers; return !!this.syncadaptor.getUpdatedTiddlers || !!this.syncadaptor.getSkinnyTiddlers;
}; }
/* /*
Force load a tiddler from the server Force load a tiddler from the server
@@ -355,7 +355,7 @@ Dispay a password prompt
*/ */
Syncer.prototype.displayLoginPrompt = function() { Syncer.prototype.displayLoginPrompt = function() {
var self = this; var self = this;
$tw.passwordPrompt.createPrompt({ var promptInfo = $tw.passwordPrompt.createPrompt({
serviceName: $tw.language.getString("LoginToTiddlySpace"), serviceName: $tw.language.getString("LoginToTiddlySpace"),
callback: function(data) { callback: function(data) {
self.login(data.username,data.password,function(err,isLoggedIn) { self.login(data.username,data.password,function(err,isLoggedIn) {
@@ -530,7 +530,7 @@ function SaveTiddlerTask(syncer,title) {
SaveTiddlerTask.prototype.toString = function() { SaveTiddlerTask.prototype.toString = function() {
return "SAVE " + this.title; return "SAVE " + this.title;
}; }
SaveTiddlerTask.prototype.run = function(callback) { SaveTiddlerTask.prototype.run = function(callback) {
var self = this, var self = this,
@@ -568,7 +568,7 @@ function DeleteTiddlerTask(syncer,title) {
DeleteTiddlerTask.prototype.toString = function() { DeleteTiddlerTask.prototype.toString = function() {
return "DELETE " + this.title; return "DELETE " + this.title;
}; }
DeleteTiddlerTask.prototype.run = function(callback) { DeleteTiddlerTask.prototype.run = function(callback) {
var self = this; var self = this;
@@ -595,7 +595,7 @@ function LoadTiddlerTask(syncer,title) {
LoadTiddlerTask.prototype.toString = function() { LoadTiddlerTask.prototype.toString = function() {
return "LOAD " + this.title; return "LOAD " + this.title;
}; }
LoadTiddlerTask.prototype.run = function(callback) { LoadTiddlerTask.prototype.run = function(callback) {
var self = this; var self = this;
@@ -621,7 +621,7 @@ function SyncFromServerTask(syncer) {
SyncFromServerTask.prototype.toString = function() { SyncFromServerTask.prototype.toString = function() {
return "SYNCFROMSERVER"; return "SYNCFROMSERVER";
}; }
SyncFromServerTask.prototype.run = function(callback) { SyncFromServerTask.prototype.run = function(callback) {
var self = this; var self = this;
+2 -1
View File
@@ -21,7 +21,8 @@ var BLOCKED_PLUGINS = {
}; };
exports.upgrade = function(wiki,titles,tiddlers) { exports.upgrade = function(wiki,titles,tiddlers) {
var messages = {}, var self = this,
messages = {},
upgradeLibrary, upgradeLibrary,
getLibraryTiddler = function(title) { getLibraryTiddler = function(title) {
if(!upgradeLibrary) { if(!upgradeLibrary) {

Some files were not shown because too many files have changed in this diff Show More