mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2026-07-11 06:12:45 +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
|
|
||||||
|
|||||||
@@ -3,4 +3,3 @@
|
|||||||
tmp/
|
tmp/
|
||||||
output/
|
output/
|
||||||
node_modules/
|
node_modules/
|
||||||
.claude/
|
|
||||||
|
|||||||
+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
-33
@@ -12,6 +12,8 @@ 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";
|
||||||
|
|
||||||
// Include bootprefix if we're not given module data
|
// Include bootprefix if we're not given module data
|
||||||
@@ -35,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
|
||||||
@@ -45,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.
|
||||||
@@ -131,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) {
|
||||||
@@ -140,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;
|
||||||
});
|
});
|
||||||
@@ -567,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.
|
||||||
@@ -590,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
|
||||||
@@ -618,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);
|
||||||
}
|
}
|
||||||
@@ -729,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;
|
||||||
@@ -775,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
|
||||||
@@ -814,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"});
|
||||||
@@ -832,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"]) {
|
||||||
@@ -893,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 {
|
||||||
@@ -1147,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) {
|
||||||
@@ -1201,7 +1201,7 @@ $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
|
||||||
@@ -1211,7 +1211,7 @@ $tw.Wiki = function(options) {
|
|||||||
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();
|
||||||
@@ -1236,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
|
||||||
@@ -1251,7 +1251,7 @@ $tw.Wiki = function(options) {
|
|||||||
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();
|
||||||
@@ -1439,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];
|
||||||
@@ -1453,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;
|
||||||
@@ -1568,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),
|
||||||
@@ -1577,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 + "]]"}));
|
||||||
@@ -2011,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);
|
||||||
@@ -2064,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) {
|
||||||
@@ -2173,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;
|
||||||
}
|
}
|
||||||
@@ -2532,7 +2534,7 @@ $tw.boot.initStartup = function(options) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
$tw.boot.loadStartup = function(options){
|
$tw.boot.loadStartup = function(options){
|
||||||
@@ -2549,7 +2551,7 @@ $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){
|
||||||
// Unpack plugin tiddlers
|
// Unpack plugin tiddlers
|
||||||
$tw.wiki.readPluginInfo();
|
$tw.wiki.readPluginInfo();
|
||||||
@@ -2579,7 +2581,7 @@ $tw.boot.execStartup = function(options){
|
|||||||
$tw.boot.disabledStartupModules = $tw.boot.disabledStartupModules || [];
|
$tw.boot.disabledStartupModules = $tw.boot.disabledStartupModules || [];
|
||||||
// Repeatedly execute the next eligible task
|
// Repeatedly execute the next eligible task
|
||||||
$tw.boot.executeNextStartupTask(options.callback);
|
$tw.boot.executeNextStartupTask(options.callback);
|
||||||
};
|
}
|
||||||
/*
|
/*
|
||||||
Startup TiddlyWiki
|
Startup TiddlyWiki
|
||||||
*/
|
*/
|
||||||
@@ -2598,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
|
||||||
@@ -2645,7 +2647,7 @@ $tw.boot.executeNextStartupTask = function(callback) {
|
|||||||
}
|
}
|
||||||
taskIndex++;
|
taskIndex++;
|
||||||
}
|
}
|
||||||
if(typeof callback === "function") {
|
if(typeof callback === 'function') {
|
||||||
callback();
|
callback();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
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,8 +0,0 @@
|
|||||||
title: TiddlyWiki Team
|
|
||||||
tags: Community/Team
|
|
||||||
modified: 20260708095630754
|
|
||||||
created: 20260708095630754
|
|
||||||
leader: @BurningTreeC
|
|
||||||
team:
|
|
||||||
|
|
||||||
The TiddlyDesktop development repository is at https://github.com/TiddlyWiki/TiddlyDesktop
|
|
||||||
+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,26 +134,21 @@ 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();
|
||||||
if(this.widget.editTag === "textarea") {
|
// If .editRows is initialised, it takes precedence
|
||||||
|
if(this.widget.editTag === "textarea" && !this.widget.editRows) {
|
||||||
if(this.widget.editAutoHeight) {
|
if(this.widget.editAutoHeight) {
|
||||||
if(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {
|
if(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {
|
||||||
var newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);
|
var newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);
|
||||||
this.iframeNode.style.height = newHeight + "px";
|
this.iframeNode.style.height = newHeight + "px";
|
||||||
}
|
}
|
||||||
} else if(!this.widget.editRows) {
|
} else {
|
||||||
var fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,"400px"),10);
|
var fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,"400px"),10);
|
||||||
fixedHeight = Math.max(fixedHeight,20);
|
fixedHeight = Math.max(fixedHeight,20);
|
||||||
this.domNode.style.height = fixedHeight + "px";
|
this.domNode.style.height = fixedHeight + "px";
|
||||||
@@ -171,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();
|
||||||
@@ -183,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;
|
||||||
@@ -203,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();
|
||||||
@@ -223,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,
|
||||||
@@ -241,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,23 +80,18 @@ 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(this.widget.editTag === "textarea") {
|
// If .editRows is initialised, it takes precedence
|
||||||
|
if((this.widget.editTag === "textarea") && !this.widget.editRows) {
|
||||||
if(this.widget.editAutoHeight) {
|
if(this.widget.editAutoHeight) {
|
||||||
if(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {
|
if(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {
|
||||||
$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);
|
$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);
|
||||||
}
|
}
|
||||||
} else if(!this.widget.editRows) {
|
} else {
|
||||||
var fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,"400px"),10);
|
var fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,"400px"),10);
|
||||||
fixedHeight = Math.max(fixedHeight,20);
|
fixedHeight = Math.max(fixedHeight,20);
|
||||||
this.domNode.style.height = fixedHeight + "px";
|
this.domNode.style.height = fixedHeight + "px";
|
||||||
@@ -113,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();
|
||||||
@@ -125,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();
|
||||||
@@ -137,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);
|
||||||
@@ -155,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) {
|
||||||
|
|||||||
+16
-36
@@ -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,7 +237,7 @@ 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 = [];
|
||||||
@@ -402,7 +382,7 @@ exports.compileFilter = function(filterString) {
|
|||||||
});
|
});
|
||||||
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;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user