mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2026-06-24 06:08:51 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d8b0e041b6 |
@@ -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"
|
||||||
|
|||||||
@@ -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 }}
|
||||||
|
|||||||
@@ -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 }}
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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("<<now "DD">>","<<now \"DD\">>");
|
var newSVG = header.join("\n") + "\n\n" + result.data.replace("<<now "DD">>","<<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
@@ -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
@@ -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
File diff suppressed because one or more lines are too long
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 + "'";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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],
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 +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();
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/background-actions.js
|
title: $:/core/modules/background-actions.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: global
|
module-type: global
|
||||||
|
|
||||||
Class to dispatch actions when filters change
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -15,16 +12,16 @@ class BackgroundActionDispatcher {
|
|||||||
this.wiki = wiki;
|
this.wiki = wiki;
|
||||||
this.nextTrackedFilterId = 1;
|
this.nextTrackedFilterId = 1;
|
||||||
this.trackedFilters = new Map(); // Use Map for better key management
|
this.trackedFilters = new Map(); // Use Map for better key management
|
||||||
// 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)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,13 +53,6 @@ class BackgroundActionDispatcher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Represents an individual tracked filter. Options include:
|
|
||||||
wiki: wiki to use
|
|
||||||
title: title of the tiddler being tracked
|
|
||||||
trackFilter: filter string to track changes
|
|
||||||
actions: actions to be executed when the filter changes
|
|
||||||
*/
|
|
||||||
class BackgroundActionTracker {
|
class BackgroundActionTracker {
|
||||||
constructor({wiki, title, trackFilter, actions}) {
|
constructor({wiki, title, trackFilter, actions}) {
|
||||||
this.wiki = wiki;
|
this.wiki = wiki;
|
||||||
@@ -75,7 +65,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);
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/config.js
|
title: $:/core/modules/config.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: config
|
module-type: config
|
||||||
|
|
||||||
Core configuration constants
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/deserializers.js
|
title: $:/core/modules/deserializers.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: tiddlerdeserializer
|
module-type: tiddlerdeserializer
|
||||||
|
|
||||||
Functions to deserialise tiddlers from a block of text
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -37,12 +34,6 @@ exports["application/json"] = function(text,fields) {
|
|||||||
return results;
|
return results;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Parse an HTML file into tiddlers. There are three possibilities:
|
|
||||||
# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers
|
|
||||||
# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers
|
|
||||||
# An ordinary HTML file
|
|
||||||
*/
|
|
||||||
exports["text/html"] = function(text,fields) {
|
exports["text/html"] = function(text,fields) {
|
||||||
var results = [];
|
var results = [];
|
||||||
// Check if we've got an old-style store area
|
// Check if we've got an old-style store area
|
||||||
@@ -60,11 +51,11 @@ exports["text/html"] = function(text,fields) {
|
|||||||
results.push.apply(results,deserializeNewStoreArea(text,newStoreAreaMarkerRegExp.lastIndex,newStoreAreaMatch[1],fields));
|
results.push.apply(results,deserializeNewStoreArea(text,newStoreAreaMarkerRegExp.lastIndex,newStoreAreaMatch[1],fields));
|
||||||
newStoreAreaMatch = newStoreAreaMarkerRegExp.exec(text);
|
newStoreAreaMatch = newStoreAreaMarkerRegExp.exec(text);
|
||||||
}
|
}
|
||||||
// Return if we had either an old-style or a new-style store area
|
|
||||||
if(storeAreaMatch || haveHadNewStoreArea) {
|
if(storeAreaMatch || haveHadNewStoreArea) {
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
// Otherwise, check whether we've got an encrypted file
|
|
||||||
var encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);
|
var encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);
|
||||||
if(encryptedStoreArea) {
|
if(encryptedStoreArea) {
|
||||||
// If so, attempt to decrypt it using the current password
|
// If so, attempt to decrypt it using the current password
|
||||||
@@ -124,19 +115,7 @@ function deserializeStoreArea(text,storeAreaEnd,isTiddlyWiki5,fields) {
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
var deserializeTiddlerDiv = function(text) {
|
||||||
Utility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:
|
|
||||||
|
|
||||||
<div title="Title" creator="JoeBloggs" modifier="JoeBloggs" created="201102111106" modified="201102111310" tags="myTag [[my long tag]]">
|
|
||||||
<pre>The text of the tiddler (without the expected HTML encoding).
|
|
||||||
</pre>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
Note that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.
|
|
||||||
|
|
||||||
When these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.
|
|
||||||
*/
|
|
||||||
var deserializeTiddlerDiv = function(text /* [,fields] */) {
|
|
||||||
// Slot together the default results
|
// Slot together the default results
|
||||||
var result = {};
|
var result = {};
|
||||||
if(arguments.length > 1) {
|
if(arguments.length > 1) {
|
||||||
@@ -147,7 +126,7 @@ var deserializeTiddlerDiv = function(text /* [,fields] */) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Parse the DIV body
|
|
||||||
var startRegExp = /^\s*<div\s+([^>]*)>(\s*<pre>)?/gi,
|
var startRegExp = /^\s*<div\s+([^>]*)>(\s*<pre>)?/gi,
|
||||||
endRegExp,
|
endRegExp,
|
||||||
match = startRegExp.exec(text);
|
match = startRegExp.exec(text);
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/editor/engines/framed.js
|
title: $:/core/modules/editor/engines/framed.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: library
|
module-type: library
|
||||||
|
|
||||||
Text editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -56,7 +53,7 @@ function FramedEngine(options) {
|
|||||||
} else {
|
} else {
|
||||||
this.domNode.value = this.value;
|
this.domNode.value = this.value;
|
||||||
}
|
}
|
||||||
// Set the attributes
|
|
||||||
if(this.widget.editType && this.widget.editTag !== "textarea") {
|
if(this.widget.editType && this.widget.editTag !== "textarea") {
|
||||||
this.domNode.setAttribute("type",this.widget.editType);
|
this.domNode.setAttribute("type",this.widget.editType);
|
||||||
}
|
}
|
||||||
@@ -78,7 +75,7 @@ function FramedEngine(options) {
|
|||||||
if(this.widget.isDisabled === "yes") {
|
if(this.widget.isDisabled === "yes") {
|
||||||
this.domNode.setAttribute("disabled",true);
|
this.domNode.setAttribute("disabled",true);
|
||||||
}
|
}
|
||||||
// Copy the styles from the dummy textarea
|
|
||||||
this.copyStyles();
|
this.copyStyles();
|
||||||
// Add event listeners
|
// Add event listeners
|
||||||
$tw.utils.addEventListeners(this.domNode,[
|
$tw.utils.addEventListeners(this.domNode,[
|
||||||
@@ -99,13 +96,10 @@ function FramedEngine(options) {
|
|||||||
{name: "click",handlerObject: this.widget,handlerMethod: "handleClickEvent"}
|
{name: "click",handlerObject: this.widget,handlerMethod: "handleClickEvent"}
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
// Insert the element into the DOM
|
|
||||||
this.iframeDoc.body.appendChild(this.domNode);
|
this.iframeDoc.body.appendChild(this.domNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Copy styles from the dummy text area to the textarea in the iframe
|
|
||||||
*/
|
|
||||||
FramedEngine.prototype.copyStyles = function() {
|
FramedEngine.prototype.copyStyles = function() {
|
||||||
// Copy all styles
|
// Copy all styles
|
||||||
$tw.utils.copyStyles(this.dummyTextArea,this.domNode);
|
$tw.utils.copyStyles(this.dummyTextArea,this.domNode);
|
||||||
@@ -127,14 +121,11 @@ FramedEngine.prototype.setText = function(text,type) {
|
|||||||
if(this.domNode.ownerDocument.activeElement !== this.domNode) {
|
if(this.domNode.ownerDocument.activeElement !== this.domNode) {
|
||||||
this.updateDomNodeText(text);
|
this.updateDomNodeText(text);
|
||||||
}
|
}
|
||||||
// Fix the height if needed
|
|
||||||
this.fixHeight();
|
this.fixHeight();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Update the DomNode with the new text
|
|
||||||
*/
|
|
||||||
FramedEngine.prototype.updateDomNodeText = function(text) {
|
FramedEngine.prototype.updateDomNodeText = function(text) {
|
||||||
try {
|
try {
|
||||||
this.domNode.value = text;
|
this.domNode.value = text;
|
||||||
@@ -143,16 +134,10 @@ FramedEngine.prototype.updateDomNodeText = function(text) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Get the text of the engine
|
|
||||||
*/
|
|
||||||
FramedEngine.prototype.getText = function() {
|
FramedEngine.prototype.getText = function() {
|
||||||
return this.domNode.value;
|
return this.domNode.value;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Fix the height of textarea to fit content
|
|
||||||
*/
|
|
||||||
FramedEngine.prototype.fixHeight = function() {
|
FramedEngine.prototype.fixHeight = function() {
|
||||||
// Make sure styles are updated
|
// Make sure styles are updated
|
||||||
this.copyStyles();
|
this.copyStyles();
|
||||||
@@ -172,9 +157,6 @@ FramedEngine.prototype.fixHeight = function() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Focus the engine node
|
|
||||||
*/
|
|
||||||
FramedEngine.prototype.focus = function() {
|
FramedEngine.prototype.focus = function() {
|
||||||
if(this.domNode.focus) {
|
if(this.domNode.focus) {
|
||||||
this.domNode.focus();
|
this.domNode.focus();
|
||||||
@@ -184,18 +166,12 @@ FramedEngine.prototype.focus = function() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Handle a focus event
|
|
||||||
*/
|
|
||||||
FramedEngine.prototype.handleFocusEvent = function(event) {
|
FramedEngine.prototype.handleFocusEvent = function(event) {
|
||||||
if(this.widget.editCancelPopups) {
|
if(this.widget.editCancelPopups) {
|
||||||
$tw.popup.cancel(0);
|
$tw.popup.cancel(0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Handle a keydown event
|
|
||||||
*/
|
|
||||||
FramedEngine.prototype.handleKeydownEvent = function(event) {
|
FramedEngine.prototype.handleKeydownEvent = function(event) {
|
||||||
if ($tw.keyboardManager.handleKeydownEvent(event, {onlyPriority: true})) {
|
if ($tw.keyboardManager.handleKeydownEvent(event, {onlyPriority: true})) {
|
||||||
return true;
|
return true;
|
||||||
@@ -204,17 +180,11 @@ FramedEngine.prototype.handleKeydownEvent = function(event) {
|
|||||||
return this.widget.handleKeydownEvent(event);
|
return this.widget.handleKeydownEvent(event);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Handle a click
|
|
||||||
*/
|
|
||||||
FramedEngine.prototype.handleClickEvent = function(event) {
|
FramedEngine.prototype.handleClickEvent = function(event) {
|
||||||
this.fixHeight();
|
this.fixHeight();
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Handle a dom "input" event which occurs when the text has changed
|
|
||||||
*/
|
|
||||||
FramedEngine.prototype.handleInputEvent = function(event) {
|
FramedEngine.prototype.handleInputEvent = function(event) {
|
||||||
this.widget.saveChanges(this.getText());
|
this.widget.saveChanges(this.getText());
|
||||||
this.fixHeight();
|
this.fixHeight();
|
||||||
@@ -224,9 +194,6 @@ FramedEngine.prototype.handleInputEvent = function(event) {
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Create a blank structure representing a text operation
|
|
||||||
*/
|
|
||||||
FramedEngine.prototype.createTextOperation = function() {
|
FramedEngine.prototype.createTextOperation = function() {
|
||||||
var operation = {
|
var operation = {
|
||||||
text: this.domNode.value,
|
text: this.domNode.value,
|
||||||
@@ -242,9 +209,6 @@ FramedEngine.prototype.createTextOperation = function() {
|
|||||||
return operation;
|
return operation;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Execute a text operation
|
|
||||||
*/
|
|
||||||
FramedEngine.prototype.executeTextOperation = function(operation) {
|
FramedEngine.prototype.executeTextOperation = function(operation) {
|
||||||
// Perform the required changes to the text area and the underlying tiddler
|
// Perform the required changes to the text area and the underlying tiddler
|
||||||
var newText = operation.text;
|
var newText = operation.text;
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/editor/engines/simple.js
|
title: $:/core/modules/editor/engines/simple.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: library
|
module-type: library
|
||||||
|
|
||||||
Text editor engine based on a simple input or textarea tag
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -30,7 +27,7 @@ function SimpleEngine(options) {
|
|||||||
} else {
|
} else {
|
||||||
this.domNode.value = this.value;
|
this.domNode.value = this.value;
|
||||||
}
|
}
|
||||||
// Set the attributes
|
|
||||||
if(this.widget.editType && this.widget.editTag !== "textarea") {
|
if(this.widget.editType && this.widget.editTag !== "textarea") {
|
||||||
this.domNode.setAttribute("type",this.widget.editType);
|
this.domNode.setAttribute("type",this.widget.editType);
|
||||||
}
|
}
|
||||||
@@ -55,7 +52,7 @@ function SimpleEngine(options) {
|
|||||||
if(this.widget.isDisabled === "yes") {
|
if(this.widget.isDisabled === "yes") {
|
||||||
this.domNode.setAttribute("disabled",true);
|
this.domNode.setAttribute("disabled",true);
|
||||||
}
|
}
|
||||||
// Add an input event handler
|
|
||||||
$tw.utils.addEventListeners(this.domNode,[
|
$tw.utils.addEventListeners(this.domNode,[
|
||||||
{name: "focus", handlerObject: this, handlerMethod: "handleFocusEvent"},
|
{name: "focus", handlerObject: this, handlerMethod: "handleFocusEvent"},
|
||||||
{name: "input", handlerObject: this, handlerMethod: "handleInputEvent"}
|
{name: "input", handlerObject: this, handlerMethod: "handleInputEvent"}
|
||||||
@@ -65,22 +62,16 @@ function SimpleEngine(options) {
|
|||||||
this.widget.domNodes.push(this.domNode);
|
this.widget.domNodes.push(this.domNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Set the text of the engine if it doesn't currently have focus
|
|
||||||
*/
|
|
||||||
SimpleEngine.prototype.setText = function(text,type) {
|
SimpleEngine.prototype.setText = function(text,type) {
|
||||||
if(!this.domNode.isTiddlyWikiFakeDom) {
|
if(!this.domNode.isTiddlyWikiFakeDom) {
|
||||||
if(this.domNode.ownerDocument.activeElement !== this.domNode || text === "") {
|
if(this.domNode.ownerDocument.activeElement !== this.domNode || text === "") {
|
||||||
this.updateDomNodeText(text);
|
this.updateDomNodeText(text);
|
||||||
}
|
}
|
||||||
// Fix the height if needed
|
|
||||||
this.fixHeight();
|
this.fixHeight();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Update the DomNode with the new text
|
|
||||||
*/
|
|
||||||
SimpleEngine.prototype.updateDomNodeText = function(text) {
|
SimpleEngine.prototype.updateDomNodeText = function(text) {
|
||||||
try {
|
try {
|
||||||
this.domNode.value = text;
|
this.domNode.value = text;
|
||||||
@@ -89,16 +80,10 @@ SimpleEngine.prototype.updateDomNodeText = function(text) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Get the text of the engine
|
|
||||||
*/
|
|
||||||
SimpleEngine.prototype.getText = function() {
|
SimpleEngine.prototype.getText = function() {
|
||||||
return this.domNode.value;
|
return this.domNode.value;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Fix the height of textarea to fit content
|
|
||||||
*/
|
|
||||||
SimpleEngine.prototype.fixHeight = function() {
|
SimpleEngine.prototype.fixHeight = function() {
|
||||||
// If .editRows is initialised, it takes precedence
|
// If .editRows is initialised, it takes precedence
|
||||||
if((this.widget.editTag === "textarea") && !this.widget.editRows) {
|
if((this.widget.editTag === "textarea") && !this.widget.editRows) {
|
||||||
@@ -114,9 +99,6 @@ SimpleEngine.prototype.fixHeight = function() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Focus the engine node
|
|
||||||
*/
|
|
||||||
SimpleEngine.prototype.focus = function() {
|
SimpleEngine.prototype.focus = function() {
|
||||||
if(this.domNode.focus) {
|
if(this.domNode.focus) {
|
||||||
this.domNode.focus();
|
this.domNode.focus();
|
||||||
@@ -126,9 +108,6 @@ SimpleEngine.prototype.focus = function() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Handle a dom "input" event which occurs when the text has changed
|
|
||||||
*/
|
|
||||||
SimpleEngine.prototype.handleInputEvent = function(event) {
|
SimpleEngine.prototype.handleInputEvent = function(event) {
|
||||||
this.widget.saveChanges(this.getText());
|
this.widget.saveChanges(this.getText());
|
||||||
this.fixHeight();
|
this.fixHeight();
|
||||||
@@ -138,9 +117,6 @@ SimpleEngine.prototype.handleInputEvent = function(event) {
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Handle a dom "focus" event
|
|
||||||
*/
|
|
||||||
SimpleEngine.prototype.handleFocusEvent = function(event) {
|
SimpleEngine.prototype.handleFocusEvent = function(event) {
|
||||||
if(this.widget.editCancelPopups) {
|
if(this.widget.editCancelPopups) {
|
||||||
$tw.popup.cancel(0);
|
$tw.popup.cancel(0);
|
||||||
@@ -156,16 +132,10 @@ SimpleEngine.prototype.handleFocusEvent = function(event) {
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Create a blank structure representing a text operation
|
|
||||||
*/
|
|
||||||
SimpleEngine.prototype.createTextOperation = function() {
|
SimpleEngine.prototype.createTextOperation = function() {
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Execute a text operation
|
|
||||||
*/
|
|
||||||
SimpleEngine.prototype.executeTextOperation = function(operation) {
|
SimpleEngine.prototype.executeTextOperation = function(operation) {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,16 +2,12 @@
|
|||||||
title: $:/core/modules/editor/factory.js
|
title: $:/core/modules/editor/factory.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: library
|
module-type: library
|
||||||
|
|
||||||
Factory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var DEFAULT_MIN_TEXT_AREA_HEIGHT = "100px"; // Minimum height of textareas in pixels
|
var DEFAULT_MIN_TEXT_AREA_HEIGHT = "100px"; // Minimum height of textareas in pixels
|
||||||
|
|
||||||
// Configuration tiddlers
|
|
||||||
var HEIGHT_MODE_TITLE = "$:/config/TextEditor/EditorHeight/Mode";
|
var HEIGHT_MODE_TITLE = "$:/config/TextEditor/EditorHeight/Mode";
|
||||||
var ENABLE_TOOLBAR_TITLE = "$:/config/TextEditor/EnableToolbar";
|
var ENABLE_TOOLBAR_TITLE = "$:/config/TextEditor/EnableToolbar";
|
||||||
|
|
||||||
@@ -141,9 +137,6 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
|
|||||||
return {value: value || "", type: type, update: update};
|
return {value: value || "", type: type, update: update};
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Handle an edit text operation message from the toolbar
|
|
||||||
*/
|
|
||||||
EditTextWidget.prototype.handleEditTextOperationMessage = function(event) {
|
EditTextWidget.prototype.handleEditTextOperationMessage = function(event) {
|
||||||
// Prepare information about the operation
|
// Prepare information about the operation
|
||||||
var operation = this.engine.createTextOperation();
|
var operation = this.engine.createTextOperation();
|
||||||
@@ -152,16 +145,13 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
|
|||||||
if(handler) {
|
if(handler) {
|
||||||
handler.call(this,event,operation);
|
handler.call(this,event,operation);
|
||||||
}
|
}
|
||||||
// Execute the operation via the engine
|
|
||||||
var newText = this.engine.executeTextOperation(operation);
|
var newText = this.engine.executeTextOperation(operation);
|
||||||
// Fix the tiddler height and save changes
|
// Fix the tiddler height and save changes
|
||||||
this.engine.fixHeight();
|
this.engine.fixHeight();
|
||||||
this.saveChanges(newText);
|
this.saveChanges(newText);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Compute the internal state of the widget
|
|
||||||
*/
|
|
||||||
EditTextWidget.prototype.execute = function() {
|
EditTextWidget.prototype.execute = function() {
|
||||||
// Get our parameters
|
// Get our parameters
|
||||||
this.editTitle = this.getAttribute("tiddler",this.getVariable("currentTiddler"));
|
this.editTitle = this.getAttribute("tiddler",this.getVariable("currentTiddler"));
|
||||||
@@ -201,7 +191,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
|
|||||||
}
|
}
|
||||||
type = type || "text";
|
type = type || "text";
|
||||||
}
|
}
|
||||||
// Get the rest of our parameters
|
|
||||||
this.editTag = this.getAttribute("tag",tag) || "input";
|
this.editTag = this.getAttribute("tag",tag) || "input";
|
||||||
this.editType = this.getAttribute("type",type);
|
this.editType = this.getAttribute("type",type);
|
||||||
// Make the child widgets
|
// Make the child widgets
|
||||||
@@ -211,9 +201,6 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
|
|||||||
this.editShowToolbar = (this.editShowToolbar === "yes") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);
|
this.editShowToolbar = (this.editShowToolbar === "yes") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
|
|
||||||
*/
|
|
||||||
EditTextWidget.prototype.refresh = function(changedTiddlers) {
|
EditTextWidget.prototype.refresh = function(changedTiddlers) {
|
||||||
var changedAttributes = this.computeAttributes();
|
var changedAttributes = this.computeAttributes();
|
||||||
// Completely rerender if any of our attributes have changed
|
// Completely rerender if any of our attributes have changed
|
||||||
@@ -234,24 +221,14 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Update the editor with new text. This method is separate from updateEditorDomNode()
|
|
||||||
so that subclasses can override updateEditor() and still use updateEditorDomNode()
|
|
||||||
*/
|
|
||||||
EditTextWidget.prototype.updateEditor = function(text,type) {
|
EditTextWidget.prototype.updateEditor = function(text,type) {
|
||||||
this.updateEditorDomNode(text,type);
|
this.updateEditorDomNode(text,type);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Update the editor dom node with new text
|
|
||||||
*/
|
|
||||||
EditTextWidget.prototype.updateEditorDomNode = function(text,type) {
|
EditTextWidget.prototype.updateEditorDomNode = function(text,type) {
|
||||||
this.engine.setText(text,type);
|
this.engine.setText(text,type);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Save changes back to the tiddler store
|
|
||||||
*/
|
|
||||||
EditTextWidget.prototype.saveChanges = function(text) {
|
EditTextWidget.prototype.saveChanges = function(text) {
|
||||||
var editInfo = this.getEditInfo();
|
var editInfo = this.getEditInfo();
|
||||||
if(text !== editInfo.value) {
|
if(text !== editInfo.value) {
|
||||||
@@ -259,9 +236,6 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Handle a dom "keydown" event, which we'll bubble up to our container for the keyboard widgets benefit
|
|
||||||
*/
|
|
||||||
EditTextWidget.prototype.handleKeydownEvent = function(event) {
|
EditTextWidget.prototype.handleKeydownEvent = function(event) {
|
||||||
// Check for a keyboard shortcut
|
// Check for a keyboard shortcut
|
||||||
if(this.toolbarNode) {
|
if(this.toolbarNode) {
|
||||||
@@ -282,20 +256,17 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Propogate the event to the container
|
|
||||||
if(this.propogateKeydownEvent(event)) {
|
if(this.propogateKeydownEvent(event)) {
|
||||||
// Ignore the keydown if it was already handled
|
// Ignore the keydown if it was already handled
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// Otherwise, process the keydown normally
|
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Propogate keydown events to our container for the keyboard widgets benefit
|
|
||||||
*/
|
|
||||||
EditTextWidget.prototype.propogateKeydownEvent = function(event) {
|
EditTextWidget.prototype.propogateKeydownEvent = function(event) {
|
||||||
var newEvent = this.cloneEvent(event,["keyCode","code","which","key","metaKey","ctrlKey","altKey","shiftKey"]);
|
var newEvent = this.cloneEvent(event,["keyCode","code","which","key","metaKey","ctrlKey","altKey","shiftKey"]);
|
||||||
return !this.parentDomNode.dispatchEvent(newEvent);
|
return !this.parentDomNode.dispatchEvent(newEvent);
|
||||||
@@ -318,10 +289,6 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
|
|||||||
return dispatchNode.dispatchEvent(newEvent);
|
return dispatchNode.dispatchEvent(newEvent);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Propogate drag and drop events with File data to our container for the dropzone widgets benefit.
|
|
||||||
If there are no Files, let the browser handle it.
|
|
||||||
*/
|
|
||||||
EditTextWidget.prototype.handleDropEvent = function(event) {
|
EditTextWidget.prototype.handleDropEvent = function(event) {
|
||||||
if($tw.utils.dragEventContainsFiles(event)) {
|
if($tw.utils.dragEventContainsFiles(event)) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/editor/operations/bitmap/clear.js
|
title: $:/core/modules/editor/operations/bitmap/clear.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: bitmapeditoroperation
|
module-type: bitmapeditoroperation
|
||||||
|
|
||||||
Bitmap editor operation to clear the image
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/editor/operations/bitmap/resize.js
|
title: $:/core/modules/editor/operations/bitmap/resize.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: bitmapeditoroperation
|
module-type: bitmapeditoroperation
|
||||||
|
|
||||||
Bitmap editor operation to resize the image
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -17,7 +14,7 @@ exports["resize"] = function(event) {
|
|||||||
if(newWidth > 0 && newHeight > 0 && !(newWidth === this.currCanvas.width && newHeight === this.currCanvas.height)) {
|
if(newWidth > 0 && newHeight > 0 && !(newWidth === this.currCanvas.width && newHeight === this.currCanvas.height)) {
|
||||||
this.changeCanvasSize(newWidth,newHeight);
|
this.changeCanvasSize(newWidth,newHeight);
|
||||||
}
|
}
|
||||||
// Update the input controls
|
|
||||||
this.refreshToolbar();
|
this.refreshToolbar();
|
||||||
// Save the image into the tiddler
|
// Save the image into the tiddler
|
||||||
this.saveChanges();
|
this.saveChanges();
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/editor/operations/bitmap/rotate-left.js
|
title: $:/core/modules/editor/operations/bitmap/rotate-left.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: bitmapeditoroperation
|
module-type: bitmapeditoroperation
|
||||||
|
|
||||||
Bitmap editor operation to rotate the image left by 90 degrees
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|||||||
@@ -2,15 +2,12 @@
|
|||||||
title: $:/core/modules/editor/operations/text/excise.js
|
title: $:/core/modules/editor/operations/text/excise.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: texteditoroperation
|
module-type: texteditoroperation
|
||||||
|
|
||||||
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) {
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/editor/operations/text/insert-text.js
|
title: $:/core/modules/editor/operations/text/insert-text.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: texteditoroperation
|
module-type: texteditoroperation
|
||||||
|
|
||||||
Text editor operation insert text at the caret position. If there is a selection it is replaced.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/editor/operations/text/make-link.js
|
title: $:/core/modules/editor/operations/text/make-link.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: texteditoroperation
|
module-type: texteditoroperation
|
||||||
|
|
||||||
Text editor operation to make a link
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/editor/operations/text/prefix-lines.js
|
title: $:/core/modules/editor/operations/text/prefix-lines.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: texteditoroperation
|
module-type: texteditoroperation
|
||||||
|
|
||||||
Text editor operation to add a prefix to the selected lines
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -26,16 +23,16 @@ exports["prefix-lines"] = function(event,operation) {
|
|||||||
line = line.substring(event.paramObject.character.length);
|
line = line.substring(event.paramObject.character.length);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
// Remove any whitespace
|
|
||||||
while(line.charAt(0) === " ") {
|
while(line.charAt(0) === " ") {
|
||||||
line = line.substring(1);
|
line = line.substring(1);
|
||||||
}
|
}
|
||||||
// We're done if we removed the exact required prefix, otherwise add it
|
|
||||||
if(count !== targetCount) {
|
if(count !== targetCount) {
|
||||||
// Apply the prefix
|
// Apply the prefix
|
||||||
line = prefix + " " + line;
|
line = prefix + " " + line;
|
||||||
}
|
}
|
||||||
// Save the modified line
|
|
||||||
lines[index] = line;
|
lines[index] = line;
|
||||||
});
|
});
|
||||||
// Stitch the replacement text together and set the selection
|
// Stitch the replacement text together and set the selection
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/editor/operations/text/replace-all.js
|
title: $:/core/modules/editor/operations/text/replace-all.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: texteditoroperation
|
module-type: texteditoroperation
|
||||||
|
|
||||||
Text editor operation to replace the entire text
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/editor/operations/text/replace-selection.js
|
title: $:/core/modules/editor/operations/text/replace-selection.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: texteditoroperation
|
module-type: texteditoroperation
|
||||||
|
|
||||||
Text editor operation to replace the selection
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/editor/operations/text/save-selection.js
|
title: $:/core/modules/editor/operations/text/save-selection.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: texteditoroperation
|
module-type: texteditoroperation
|
||||||
|
|
||||||
Text editor operation to save the current selection in a specified tiddler
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/editor/operations/text/wrap-lines.js
|
title: $:/core/modules/editor/operations/text/wrap-lines.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: texteditoroperation
|
module-type: texteditoroperation
|
||||||
|
|
||||||
Text editor operation to wrap the selected lines with a prefix and suffix
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -15,14 +12,14 @@ exports["wrap-lines"] = function(event,operation) {
|
|||||||
if($tw.utils.endsWith(operation.text.substring(0,operation.selStart), prefix + "\n") &&
|
if($tw.utils.endsWith(operation.text.substring(0,operation.selStart), prefix + "\n") &&
|
||||||
$tw.utils.startsWith(operation.text.substring(operation.selEnd), "\n" + suffix)) {
|
$tw.utils.startsWith(operation.text.substring(operation.selEnd), "\n" + suffix)) {
|
||||||
// Selected text is already surrounded by prefix and suffix: Remove them
|
// Selected text is already surrounded by prefix and suffix: Remove them
|
||||||
// Cut selected text plus prefix and suffix
|
|
||||||
operation.cutStart = operation.selStart - (prefix.length + 1);
|
operation.cutStart = operation.selStart - (prefix.length + 1);
|
||||||
operation.cutEnd = operation.selEnd + suffix.length + 1;
|
operation.cutEnd = operation.selEnd + suffix.length + 1;
|
||||||
// Also cut the following newline (if there is any)
|
// Also cut the following newline (if there is any)
|
||||||
if (operation.text[operation.cutEnd] === "\n") {
|
if (operation.text[operation.cutEnd] === "\n") {
|
||||||
operation.cutEnd++;
|
operation.cutEnd++;
|
||||||
}
|
}
|
||||||
// Replace with selection
|
|
||||||
operation.replacement = operation.text.substring(operation.selStart,operation.selEnd);
|
operation.replacement = operation.text.substring(operation.selStart,operation.selEnd);
|
||||||
// Select text that was in between prefix and suffix
|
// Select text that was in between prefix and suffix
|
||||||
operation.newSelStart = operation.cutStart;
|
operation.newSelStart = operation.cutStart;
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/editor/operations/text/wrap-selection.js
|
title: $:/core/modules/editor/operations/text/wrap-selection.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: texteditoroperation
|
module-type: texteditoroperation
|
||||||
|
|
||||||
Text editor operation to wrap the selection with the specified prefix and suffix
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -17,11 +14,11 @@ exports["wrap-selection"] = function(event,operation) {
|
|||||||
selLength = o.selEnd - o.selStart;
|
selLength = o.selEnd - o.selStart;
|
||||||
|
|
||||||
// This function detects, if trailing spaces are part of the selection __and__ if the user wants to handle them
|
// This function detects, if trailing spaces are part of the selection __and__ if the user wants to handle them
|
||||||
// Returns "yes", "start", "end", "no" (default)
|
|
||||||
// yes .. there are trailing spaces at both ends
|
// yes .. there are trailing spaces at both ends
|
||||||
// start .. there are trailing spaces at the start
|
|
||||||
// end .. there are trailing spaces at the end
|
// end .. there are trailing spaces at the end
|
||||||
// no .. no trailing spaces are taken into account
|
|
||||||
var trailingSpaceAt = function(sel) {
|
var trailingSpaceAt = function(sel) {
|
||||||
var _start,
|
var _start,
|
||||||
_end,
|
_end,
|
||||||
@@ -44,7 +41,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) {
|
||||||
@@ -64,7 +61,6 @@ exports["wrap-selection"] = function(event,operation) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// options: lenPrefix, lenSuffix
|
|
||||||
function removePrefixSuffix(options) {
|
function removePrefixSuffix(options) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
var _lenPrefix = options.lenPrefix || 0;
|
var _lenPrefix = options.lenPrefix || 0;
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/filter-tracker.js
|
title: $:/core/modules/filter-tracker.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: global
|
module-type: global
|
||||||
|
|
||||||
Class to track the results of a filter string
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -21,14 +18,6 @@ class FilterTracker {
|
|||||||
this.processChanges(changes);
|
this.processChanges(changes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Add a tracker to the filter tracker. Returns null if any of the parameters are invalid, or a tracker id if the tracker was added successfully. Options include:
|
|
||||||
filterString: the filter string to track
|
|
||||||
fnEnter: function to call when a title enters the filter results. Called even if the tiddler does not actually exist. Called as (title), and should return a truthy value that is stored in the tracker as the "enterValue"
|
|
||||||
fnLeave: function to call when a title leaves the filter results. Called as (title,enterValue)
|
|
||||||
fnChange: function to call when a tiddler changes in the filter results. Only called for filter results that identify a tiddler or shadow tiddler. Called as (title,enterValue), and may optionally return a replacement enterValue
|
|
||||||
fnProcess: function to call each time the tracker is processed, after any enter, leave or change functions are called. Called as (changes)
|
|
||||||
*/
|
|
||||||
track(options = {}) {
|
track(options = {}) {
|
||||||
const {
|
const {
|
||||||
filterString,
|
filterString,
|
||||||
@@ -69,17 +58,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 +80,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,17 +2,10 @@
|
|||||||
title: $:/core/modules/filterrunprefixes/all.js
|
title: $:/core/modules/filterrunprefixes/all.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filterrunprefix
|
module-type: filterrunprefix
|
||||||
|
|
||||||
Union of sets without de-duplication.
|
|
||||||
Equivalent to = filter run prefix.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter prefix function
|
|
||||||
*/
|
|
||||||
exports.all = function(operationSubFunction) {
|
exports.all = function(operationSubFunction) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
results.push.apply(results, operationSubFunction(source,widget));
|
results.push.apply(results, operationSubFunction(source,widget));
|
||||||
|
|||||||
@@ -2,17 +2,10 @@
|
|||||||
title: $:/core/modules/filterrunprefixes/and.js
|
title: $:/core/modules/filterrunprefixes/and.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filterrunprefix
|
module-type: filterrunprefix
|
||||||
|
|
||||||
Intersection of sets.
|
|
||||||
Equivalent to + filter run prefix.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter prefix function
|
|
||||||
*/
|
|
||||||
exports.and = function(operationSubFunction,options) {
|
exports.and = function(operationSubFunction,options) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved
|
// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved
|
||||||
|
|||||||
@@ -6,9 +6,6 @@ module-type: filterrunprefix
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter prefix function
|
|
||||||
*/
|
|
||||||
exports.cascade = function(operationSubFunction,options) {
|
exports.cascade = function(operationSubFunction,options) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
if(results.length !== 0) {
|
if(results.length !== 0) {
|
||||||
@@ -34,5 +31,5 @@ exports.cascade = function(operationSubFunction,options) {
|
|||||||
results.push(result);
|
results.push(result);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filterrunprefixes/else.js
|
title: $:/core/modules/filterrunprefixes/else.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filterrunprefix
|
module-type: filterrunprefix
|
||||||
|
|
||||||
Equivalent to ~ filter run prefix.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter prefix function
|
|
||||||
*/
|
|
||||||
exports.else = function(operationSubFunction) {
|
exports.else = function(operationSubFunction) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
if(results.length === 0) {
|
if(results.length === 0) {
|
||||||
|
|||||||
@@ -2,17 +2,10 @@
|
|||||||
title: $:/core/modules/filterrunprefixes/except.js
|
title: $:/core/modules/filterrunprefixes/except.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filterrunprefix
|
module-type: filterrunprefix
|
||||||
|
|
||||||
Difference of sets.
|
|
||||||
Equivalent to - filter run prefix.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter prefix function
|
|
||||||
*/
|
|
||||||
exports.except = function(operationSubFunction) {
|
exports.except = function(operationSubFunction) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
results.remove(operationSubFunction(source,widget));
|
results.remove(operationSubFunction(source,widget));
|
||||||
|
|||||||
@@ -2,14 +2,10 @@
|
|||||||
title: $:/core/modules/filterrunprefixes/filter.js
|
title: $:/core/modules/filterrunprefixes/filter.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filterrunprefix
|
module-type: filterrunprefix
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.filter = function(operationSubFunction,options) {
|
exports.filter = function(operationSubFunction,options) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
if(results.length > 0) {
|
if(results.length > 0) {
|
||||||
@@ -30,5 +26,5 @@ exports.filter = function(operationSubFunction,options) {
|
|||||||
});
|
});
|
||||||
results.remove(resultsToRemove);
|
results.remove(resultsToRemove);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,14 +2,10 @@
|
|||||||
title: $:/core/modules/filterrunprefixes/intersection.js
|
title: $:/core/modules/filterrunprefixes/intersection.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filterrunprefix
|
module-type: filterrunprefix
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter prefix function
|
|
||||||
*/
|
|
||||||
exports.intersection = function(operationSubFunction) {
|
exports.intersection = function(operationSubFunction) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
if(results.length !== 0) {
|
if(results.length !== 0) {
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filterrunprefixes/let.js
|
title: $:/core/modules/filterrunprefixes/let.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filterrunprefix
|
module-type: filterrunprefix
|
||||||
|
|
||||||
Assign a value to a variable
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter prefix function
|
|
||||||
*/
|
|
||||||
exports.let = function(operationSubFunction,options) {
|
exports.let = function(operationSubFunction,options) {
|
||||||
// Return the filter run prefix function
|
// Return the filter run prefix function
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
@@ -28,7 +22,7 @@ exports.let = function(operationSubFunction,options) {
|
|||||||
if(typeof name !== "string" || name.length === 0) {
|
if(typeof name !== "string" || name.length === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Assign the result of the subfunction to the variable
|
|
||||||
var variables = {};
|
var variables = {};
|
||||||
variables[name] = resultList;
|
variables[name] = resultList;
|
||||||
// Return the variables
|
// Return the variables
|
||||||
|
|||||||
@@ -6,9 +6,6 @@ module-type: filterrunprefix
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter prefix function
|
|
||||||
*/
|
|
||||||
exports.map = function(operationSubFunction,options) {
|
exports.map = function(operationSubFunction,options) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
if(results.length > 0) {
|
if(results.length > 0) {
|
||||||
@@ -28,12 +25,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,16 +2,10 @@
|
|||||||
title: $:/core/modules/filterrunprefixes/or.js
|
title: $:/core/modules/filterrunprefixes/or.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filterrunprefix
|
module-type: filterrunprefix
|
||||||
|
|
||||||
Equivalent to a filter run with no prefix.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter prefix function
|
|
||||||
*/
|
|
||||||
exports.or = function(operationSubFunction) {
|
exports.or = function(operationSubFunction) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
results.pushTop(operationSubFunction(source,widget));
|
results.pushTop(operationSubFunction(source,widget));
|
||||||
|
|||||||
@@ -6,9 +6,6 @@ module-type: filterrunprefix
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter prefix function
|
|
||||||
*/
|
|
||||||
exports.reduce = function(operationSubFunction,options) {
|
exports.reduce = function(operationSubFunction,options) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
if(results.length > 0) {
|
if(results.length > 0) {
|
||||||
@@ -31,5 +28,5 @@ exports.reduce = function(operationSubFunction,options) {
|
|||||||
results.clear();
|
results.clear();
|
||||||
results.push(accumulator);
|
results.push(accumulator);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,14 +2,10 @@
|
|||||||
title: $:/core/modules/filterrunprefixes/sort.js
|
title: $:/core/modules/filterrunprefixes/sort.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filterrunprefix
|
module-type: filterrunprefix
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter prefix function
|
|
||||||
*/
|
|
||||||
exports.sort = function(operationSubFunction,options) {
|
exports.sort = function(operationSubFunction,options) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
if(results.length > 0) {
|
if(results.length > 0) {
|
||||||
@@ -33,7 +29,7 @@ exports.sort = function(operationSubFunction,options) {
|
|||||||
for(var t=0; t<inputTitles.length; t++) {
|
for(var t=0; t<inputTitles.length; t++) {
|
||||||
indexes[t] = t;
|
indexes[t] = t;
|
||||||
}
|
}
|
||||||
// Sort the indexes
|
|
||||||
compareFn = $tw.utils.makeCompareFunction(sortType,{defaultType: "string", invert:invert, isCaseSensitive:isCaseSensitive});
|
compareFn = $tw.utils.makeCompareFunction(sortType,{defaultType: "string", invert:invert, isCaseSensitive:isCaseSensitive});
|
||||||
indexes = indexes.sort(function(a,b) {
|
indexes = indexes.sort(function(a,b) {
|
||||||
return compareFn(sortKeys[a],sortKeys[b]);
|
return compareFn(sortKeys[a],sortKeys[b]);
|
||||||
@@ -43,5 +39,5 @@ exports.sort = function(operationSubFunction,options) {
|
|||||||
results.push(inputTitles[index]);
|
results.push(inputTitles[index]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filterrunprefixes/then.js
|
title: $:/core/modules/filterrunprefixes/then.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filterrunprefix
|
module-type: filterrunprefix
|
||||||
|
|
||||||
Replace results of previous runs unless empty
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter prefix function
|
|
||||||
*/
|
|
||||||
exports.then = function(operationSubFunction) {
|
exports.then = function(operationSubFunction) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
if(results.length !== 0) {
|
if(results.length !== 0) {
|
||||||
|
|||||||
+25
-62
@@ -2,39 +2,28 @@
|
|||||||
title: $:/core/modules/filters.js
|
title: $:/core/modules/filters.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: wikimethod
|
module-type: wikimethod
|
||||||
|
|
||||||
Adds tiddler filtering methods to the $tw.Wiki object.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var widgetClass = require("$:/core/modules/widgets/widget.js").widget;
|
var widgetClass = require("$:/core/modules/widgets/widget.js").widget;
|
||||||
|
|
||||||
/* Maximum permitted filter recursion depth */
|
|
||||||
var MAX_FILTER_DEPTH = 300;
|
var MAX_FILTER_DEPTH = 300;
|
||||||
|
|
||||||
/*
|
|
||||||
Parses an operation (i.e. a run) within a filter string
|
|
||||||
operators: Array of array of operator nodes into which results should be inserted
|
|
||||||
filterString: filter string
|
|
||||||
p: start position within the string
|
|
||||||
Returns the new start position, after the parsed operation
|
|
||||||
*/
|
|
||||||
function parseFilterOperation(operators,filterString,p) {
|
function parseFilterOperation(operators,filterString,p) {
|
||||||
var nextBracketPos, operator;
|
var nextBracketPos, operator;
|
||||||
// Skip the starting square bracket
|
// Skip the starting square bracket
|
||||||
if(filterString.charAt(p++) !== "[") {
|
if(filterString.charAt(p++) !== "[") {
|
||||||
throw "Missing [ in filter expression";
|
throw "Missing [ in filter expression";
|
||||||
}
|
}
|
||||||
// Process each operator in turn
|
|
||||||
do {
|
do {
|
||||||
operator = {};
|
operator = {};
|
||||||
// Check for an operator prefix
|
// Check for an operator prefix
|
||||||
if(filterString.charAt(p) === "!") {
|
if(filterString.charAt(p) === "!") {
|
||||||
operator.prefix = filterString.charAt(p++);
|
operator.prefix = filterString.charAt(p++);
|
||||||
}
|
}
|
||||||
// Get the operator name
|
|
||||||
nextBracketPos = filterString.substring(p).search(/[\[\{<\/\(]/);
|
nextBracketPos = filterString.substring(p).search(/[\[\{<\/\(]/);
|
||||||
if(nextBracketPos === -1) {
|
if(nextBracketPos === -1) {
|
||||||
throw "Missing [ in filter expression";
|
throw "Missing [ in filter expression";
|
||||||
@@ -43,7 +32,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);
|
||||||
@@ -60,7 +49,7 @@ function parseFilterOperation(operators,filterString,p) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// Empty operator means: title
|
|
||||||
else if(operator.operator === "") {
|
else if(operator.operator === "") {
|
||||||
operator.operator = "title";
|
operator.operator = "title";
|
||||||
}
|
}
|
||||||
@@ -108,7 +97,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);
|
||||||
@@ -125,20 +114,16 @@ function parseFilterOperation(operators,filterString,p) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Push this operator
|
|
||||||
operators.push(operator);
|
operators.push(operator);
|
||||||
} while(filterString.charAt(p) !== "]");
|
} while(filterString.charAt(p) !== "]");
|
||||||
// Skip the ending square bracket
|
// Skip the ending square bracket
|
||||||
if(filterString.charAt(p++) !== "]") {
|
if(filterString.charAt(p++) !== "]") {
|
||||||
throw "Missing ] in filter expression";
|
throw "Missing ] in filter expression";
|
||||||
}
|
}
|
||||||
// Return the parsing position
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Parse a filter string
|
|
||||||
*/
|
|
||||||
exports.parseFilter = function(filterString) {
|
exports.parseFilter = function(filterString) {
|
||||||
filterString = filterString || "";
|
filterString = filterString || "";
|
||||||
var results = [], // Array of arrays of operator nodes {operator:,operand:}
|
var results = [], // Array of arrays of operator nodes {operator:,operand:}
|
||||||
@@ -147,11 +132,11 @@ exports.parseFilter = function(filterString) {
|
|||||||
var whitespaceRegExp = /(\s+)/mg,
|
var whitespaceRegExp = /(\s+)/mg,
|
||||||
// Groups:
|
// Groups:
|
||||||
// 1 - entire filter run prefix
|
// 1 - entire filter run prefix
|
||||||
// 2 - filter run prefix itself
|
|
||||||
// 3 - filter run prefix suffixes
|
// 3 - filter run prefix suffixes
|
||||||
// 4 - opening square bracket following filter run prefix
|
|
||||||
// 5 - double quoted string following filter run prefix
|
// 5 - double quoted string following filter run prefix
|
||||||
// 6 - single quoted string following filter run prefix
|
|
||||||
// 7 - anything except for whitespace and square brackets
|
// 7 - anything except for whitespace and square brackets
|
||||||
operandRegExp = /((?:\+|\-|~|(?:=>?)|\:(\w+)(?:\:([\w\:, ]*))?)?)(?:(\[)|(?:"([^"]*)")|(?:'([^']*)')|([^\s\[\]]+))/mg;
|
operandRegExp = /((?:\+|\-|~|(?:=>?)|\:(\w+)(?:\:([\w\:, ]*))?)?)(?:(\[)|(?:"([^"]*)")|(?:'([^']*)')|([^\s\[\]]+))/mg;
|
||||||
while(p < filterString.length) {
|
while(p < filterString.length) {
|
||||||
@@ -161,7 +146,7 @@ exports.parseFilter = function(filterString) {
|
|||||||
if(match && match.index === p) {
|
if(match && match.index === p) {
|
||||||
p = p + match[0].length;
|
p = p + match[0].length;
|
||||||
}
|
}
|
||||||
// Match the start of the operation
|
|
||||||
if(p < filterString.length) {
|
if(p < filterString.length) {
|
||||||
operandRegExp.lastIndex = p;
|
operandRegExp.lastIndex = p;
|
||||||
var operation = {
|
var operation = {
|
||||||
@@ -178,7 +163,7 @@ exports.parseFilter = function(filterString) {
|
|||||||
if(match[2]) {
|
if(match[2]) {
|
||||||
operation.namedPrefix = match[2];
|
operation.namedPrefix = match[2];
|
||||||
}
|
}
|
||||||
// Suffixes for filter run prefix
|
|
||||||
if(match[3]) {
|
if(match[3]) {
|
||||||
operation.suffixes = [];
|
operation.suffixes = [];
|
||||||
$tw.utils.each(match[3].split(":"),function(subsuffix) {
|
$tw.utils.each(match[3].split(":"),function(subsuffix) {
|
||||||
@@ -192,7 +177,7 @@ exports.parseFilter = function(filterString) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Opening square bracket
|
|
||||||
if(match[4]) {
|
if(match[4]) {
|
||||||
p = parseFilterOperation(operation.operators,filterString,p);
|
p = parseFilterOperation(operation.operators,filterString,p);
|
||||||
} else {
|
} else {
|
||||||
@@ -202,7 +187,7 @@ exports.parseFilter = function(filterString) {
|
|||||||
// No filter run prefix
|
// No filter run prefix
|
||||||
p = parseFilterOperation(operation.operators,filterString,p);
|
p = parseFilterOperation(operation.operators,filterString,p);
|
||||||
}
|
}
|
||||||
// Quoted strings and unquoted title
|
|
||||||
if(match[5] || match[6] || match[7]) { // Double quoted string, single quoted string or unquoted title
|
if(match[5] || match[6] || match[7]) { // Double quoted string, single quoted string or unquoted title
|
||||||
operation.operators.push(
|
operation.operators.push(
|
||||||
{operator: "title", operands: [{text: match[5] || match[6] || match[7]}]}
|
{operator: "title", operands: [{text: match[5] || match[6] || match[7]}]}
|
||||||
@@ -228,18 +213,13 @@ 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);
|
||||||
return fn.call(this,source,widget);
|
return fn.call(this,source,widget);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Compile a filter into a function with the signature fn(source,widget) where:
|
|
||||||
source: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)
|
|
||||||
widget: an optional widget node for retrieving the current tiddler etc.
|
|
||||||
*/
|
|
||||||
exports.compileFilter = function(filterString) {
|
exports.compileFilter = function(filterString) {
|
||||||
if(!this.filterCache) {
|
if(!this.filterCache) {
|
||||||
this.filterCache = Object.create(null);
|
this.filterCache = Object.create(null);
|
||||||
@@ -257,11 +237,10 @@ exports.compileFilter = function(filterString) {
|
|||||||
return [$tw.language.getString("Error/Filter") + ": " + e];
|
return [$tw.language.getString("Error/Filter") + ": " + e];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
// Get the hashmap of filter operator functions
|
|
||||||
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 +269,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 +323,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 +352,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 +362,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,17 +374,15 @@ 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.
|
||||||
// Reset if exceeded. This should give us 95% of the benefit
|
|
||||||
// that no cache limit would give us.
|
// that no cache limit would give us.
|
||||||
this.filterCache = Object.create(null);
|
this.filterCache = Object.create(null);
|
||||||
this.filterCacheCount = 0;
|
this.filterCacheCount = 0;
|
||||||
|
|||||||
@@ -2,18 +2,10 @@
|
|||||||
title: $:/core/modules/filters/addprefix.js
|
title: $:/core/modules/filters/addprefix.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator for adding a prefix to each title in the list. This is
|
|
||||||
especially useful in contexts where only a filter expression is allowed
|
|
||||||
and macro substitution isn't available.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.addprefix = function(source,operator,options) {
|
exports.addprefix = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [];
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
|
|||||||
@@ -2,18 +2,10 @@
|
|||||||
title: $:/core/modules/filters/addsuffix.js
|
title: $:/core/modules/filters/addsuffix.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator for adding a suffix to each title in the list. This is
|
|
||||||
especially useful in contexts where only a filter expression is allowed
|
|
||||||
and macro substitution isn't available.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.addsuffix = function(source,operator,options) {
|
exports.addsuffix = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [];
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/after.js
|
title: $:/core/modules/filters/after.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator returning the tiddler from the current list that is after the tiddler named in the operand.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.after = function(source,operator,options) {
|
exports.after = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [];
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
|
|||||||
@@ -2,11 +2,6 @@
|
|||||||
title: $:/core/modules/filters/all.js
|
title: $:/core/modules/filters/all.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator for selecting tiddlers
|
|
||||||
|
|
||||||
[all[shadows+tiddlers]]
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -21,9 +16,6 @@ function getAllFilterOperators() {
|
|||||||
return allFilterOperators;
|
return allFilterOperators;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.all = function(source,operator,options) {
|
exports.all = function(source,operator,options) {
|
||||||
// Check for common optimisations
|
// Check for common optimisations
|
||||||
var subops = operator.operand.split("+");
|
var subops = operator.operand.split("+");
|
||||||
@@ -38,7 +30,7 @@ exports.all = function(source,operator,options) {
|
|||||||
} else if(subops.length === 2 && subops[0] === "shadows" && subops[1] === "tiddlers") {
|
} else if(subops.length === 2 && subops[0] === "shadows" && subops[1] === "tiddlers") {
|
||||||
return options.wiki.eachShadowPlusTiddlers;
|
return options.wiki.eachShadowPlusTiddlers;
|
||||||
}
|
}
|
||||||
// Do it the hard way
|
|
||||||
// Get our suboperators
|
// Get our suboperators
|
||||||
var allFilterOperators = getAllFilterOperators();
|
var allFilterOperators = getAllFilterOperators();
|
||||||
// Cycle through the suboperators accumulating their results
|
// Cycle through the suboperators accumulating their results
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/all/current.js
|
title: $:/core/modules/filters/all/current.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: allfilteroperator
|
module-type: allfilteroperator
|
||||||
|
|
||||||
Filter function for [all[current]]
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.current = function(source,prefix,options) {
|
exports.current = function(source,prefix,options) {
|
||||||
var currTiddlerTitle = options.widget && options.widget.getVariable("currentTiddler");
|
var currTiddlerTitle = options.widget && options.widget.getVariable("currentTiddler");
|
||||||
if(currTiddlerTitle) {
|
if(currTiddlerTitle) {
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/all/missing.js
|
title: $:/core/modules/filters/all/missing.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: allfilteroperator
|
module-type: allfilteroperator
|
||||||
|
|
||||||
Filter function for [all[missing]]
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.missing = function(source,prefix,options) {
|
exports.missing = function(source,prefix,options) {
|
||||||
return options.wiki.getMissingTitles();
|
return options.wiki.getMissingTitles();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/all/orphans.js
|
title: $:/core/modules/filters/all/orphans.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: allfilteroperator
|
module-type: allfilteroperator
|
||||||
|
|
||||||
Filter function for [all[orphans]]
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.orphans = function(source,prefix,options) {
|
exports.orphans = function(source,prefix,options) {
|
||||||
return options.wiki.getOrphanTitles();
|
return options.wiki.getOrphanTitles();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/all/shadows.js
|
title: $:/core/modules/filters/all/shadows.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: allfilteroperator
|
module-type: allfilteroperator
|
||||||
|
|
||||||
Filter function for [all[shadows]]
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.shadows = function(source,prefix,options) {
|
exports.shadows = function(source,prefix,options) {
|
||||||
return options.wiki.allShadowTitles();
|
return options.wiki.allShadowTitles();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/all/tags.js
|
title: $:/core/modules/filters/all/tags.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: allfilteroperator
|
module-type: allfilteroperator
|
||||||
|
|
||||||
Filter function for [all[tags]]
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.tags = function(source,prefix,options) {
|
exports.tags = function(source,prefix,options) {
|
||||||
return Object.keys(options.wiki.getTagMap());
|
return Object.keys(options.wiki.getTagMap());
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/all/tiddlers.js
|
title: $:/core/modules/filters/all/tiddlers.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: allfilteroperator
|
module-type: allfilteroperator
|
||||||
|
|
||||||
Filter function for [all[tiddlers]]
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.tiddlers = function(source,prefix,options) {
|
exports.tiddlers = function(source,prefix,options) {
|
||||||
return options.wiki.allTitles();
|
return options.wiki.allTitles();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/backlinks.js
|
title: $:/core/modules/filters/backlinks.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator for returning all the backlinks from a tiddler
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.backlinks = function(source,operator,options) {
|
exports.backlinks = function(source,operator,options) {
|
||||||
var results = new $tw.utils.LinkedList();
|
var results = new $tw.utils.LinkedList();
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
|
|||||||
@@ -2,15 +2,9 @@
|
|||||||
title: $:/core/modules/filters/backtranscludes.js
|
title: $:/core/modules/filters/backtranscludes.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator for returning all the backtranscludes from a tiddler
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.backtranscludes = function(source,operator,options) {
|
exports.backtranscludes = function(source,operator,options) {
|
||||||
var results = new $tw.utils.LinkedList();
|
var results = new $tw.utils.LinkedList();
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/before.js
|
title: $:/core/modules/filters/before.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator returning the tiddler from the current list that is before the tiddler named in the operand.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.before = function(source,operator,options) {
|
exports.before = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [];
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/commands.js
|
title: $:/core/modules/filters/commands.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator for returning the names of the commands available in this wiki
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.commands = function(source,operator,options) {
|
exports.commands = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [];
|
||||||
$tw.utils.each($tw.commands,function(commandInfo,name) {
|
$tw.utils.each($tw.commands,function(commandInfo,name) {
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/filters/compare.js
|
title: $:/core/modules/filters/compare.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
General purpose comparison operator
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
@@ -32,4 +29,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;}
|
||||||
};
|
}
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/contains.js
|
title: $:/core/modules/filters/contains.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator for finding values in array fields
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.contains = function(source,operator,options) {
|
exports.contains = function(source,operator,options) {
|
||||||
var results = [],
|
var results = [],
|
||||||
fieldname = operator.suffix || "list";
|
fieldname = operator.suffix || "list";
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/count.js
|
title: $:/core/modules/filters/count.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator returning the number of entries in the current list.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.count = function(source,operator,options) {
|
exports.count = function(source,operator,options) {
|
||||||
var count = 0;
|
var count = 0;
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
title: $:/core/modules/filters/crypto.js
|
title: $:/core/modules/filters/crypto.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operators for cryptography, using the Stanford JavaScript library
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/days.js
|
title: $:/core/modules/filters/days.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator that selects tiddlers with a specified date field within a specified date interval.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.days = function(source,operator,options) {
|
exports.days = function(source,operator,options) {
|
||||||
var results = [],
|
var results = [],
|
||||||
fieldName = operator.suffix || "modified",
|
fieldName = operator.suffix || "modified",
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
}
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/deserializers.js
|
title: $:/core/modules/filters/deserializers.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator for returning the names of the deserializers in this wiki
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.deserializers = function(source,operator,options) {
|
exports.deserializers = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [];
|
||||||
$tw.utils.each($tw.Wiki.tiddlerDeserializerModules,function(deserializer,type) {
|
$tw.utils.each($tw.Wiki.tiddlerDeserializerModules,function(deserializer,type) {
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/duplicateslugs.js
|
title: $:/core/modules/filters/duplicateslugs.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter function for [duplicateslugs[]]
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.duplicateslugs = function(source,operator,options) {
|
exports.duplicateslugs = function(source,operator,options) {
|
||||||
var slugs = Object.create(null), // Hashmap by slug of title, replaced with "true" if the duplicate title has already been output
|
var slugs = Object.create(null), // Hashmap by slug of title, replaced with "true" if the duplicate title has already been output
|
||||||
results = [];
|
results = [];
|
||||||
|
|||||||
@@ -2,17 +2,10 @@
|
|||||||
title: $:/core/modules/filters/each.js
|
title: $:/core/modules/filters/each.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator that selects one tiddler for each unique value of the specified field.
|
|
||||||
With suffix "list", selects all tiddlers that are values in a specified list field.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.each = function(source,operator,options) {
|
exports.each = function(source,operator,options) {
|
||||||
var results =[] ,
|
var results =[] ,
|
||||||
value,values = {},
|
value,values = {},
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/eachday.js
|
title: $:/core/modules/filters/eachday.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator that selects one tiddler for each unique day covered by the specified date field
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.eachday = function(source,operator,options) {
|
exports.eachday = function(source,operator,options) {
|
||||||
var results = [],
|
var results = [],
|
||||||
values = [],
|
values = [],
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/editiondescription.js
|
title: $:/core/modules/filters/editiondescription.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator for returning the descriptions of the specified edition names
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.editiondescription = function(source,operator,options) {
|
exports.editiondescription = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [];
|
||||||
if($tw.node) {
|
if($tw.node) {
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/editions.js
|
title: $:/core/modules/filters/editions.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator for returning the names of the available editions in this wiki
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.editions = function(source,operator,options) {
|
exports.editions = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [];
|
||||||
if($tw.node) {
|
if($tw.node) {
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/else.js
|
title: $:/core/modules/filters/else.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator for replacing an empty input list with a constant, passing a non-empty input list straight through
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.else = function(source,operator,options) {
|
exports.else = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [];
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
|
|||||||
@@ -2,17 +2,10 @@
|
|||||||
title: $:/core/modules/filters/decodeuricomponent.js
|
title: $:/core/modules/filters/decodeuricomponent.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator for applying decodeURIComponent() to each item.
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
exports.decodebase64 = function(source,operator,options) {
|
exports.decodebase64 = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [];
|
||||||
var binary = operator.suffixes && operator.suffixes[0].indexOf("binary") !== -1;
|
var binary = operator.suffixes && operator.suffixes[0].indexOf("binary") !== -1;
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/enlist.js
|
title: $:/core/modules/filters/enlist.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator returning its operand parsed as a list
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.enlist = function(source,operator,options) {
|
exports.enlist = function(source,operator,options) {
|
||||||
var allowDuplicates = false;
|
var allowDuplicates = false;
|
||||||
switch(operator.suffix) {
|
switch(operator.suffix) {
|
||||||
|
|||||||
@@ -2,16 +2,10 @@
|
|||||||
title: $:/core/modules/filters/field.js
|
title: $:/core/modules/filters/field.js
|
||||||
type: application/javascript
|
type: application/javascript
|
||||||
module-type: filteroperator
|
module-type: filteroperator
|
||||||
|
|
||||||
Filter operator for comparing fields for equality
|
|
||||||
|
|
||||||
\*/
|
\*/
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
/*
|
|
||||||
Export our filter function
|
|
||||||
*/
|
|
||||||
exports.field = function(source,operator,options) {
|
exports.field = function(source,operator,options) {
|
||||||
var results = [],indexedResults,
|
var results = [],indexedResults,
|
||||||
fieldname = operator.suffix || operator.operator || "title";
|
fieldname = operator.suffix || operator.operator || "title";
|
||||||
@@ -53,7 +47,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) {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user