Compare commits
1 Commits
revert-962
...
5.4.0-rele
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a29e8a8452 |
16
.github/workflows/ci.yml
vendored
@@ -5,17 +5,17 @@ on:
|
||||
- master
|
||||
- tiddlywiki-com
|
||||
env:
|
||||
NODE_VERSION: "22.22"
|
||||
NODE_VERSION: "22"
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-node@v6
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "${{ env.NODE_VERSION }}"
|
||||
- run: "./bin/ci-test.sh"
|
||||
- uses: actions/upload-artifact@v7
|
||||
- uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
with:
|
||||
name: playwright-report
|
||||
@@ -30,8 +30,8 @@ jobs:
|
||||
TW5_BUILD_MAIN_EDITION: "./editions/prerelease"
|
||||
TW5_BUILD_OUTPUT: "./output/prerelease"
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-node@v6
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "${{ env.NODE_VERSION }}"
|
||||
- run: "./bin/ci-pre-build.sh"
|
||||
@@ -62,8 +62,8 @@ jobs:
|
||||
TW5_BUILD_OUTPUT: "./output"
|
||||
TW5_BUILD_ARCHIVE: "./output"
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-node@v6
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "${{ env.NODE_VERSION }}"
|
||||
- run: "./bin/ci-pre-build.sh"
|
||||
|
||||
4
.github/workflows/pr-check-build-size.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
||||
steps:
|
||||
- name: build-size-check
|
||||
id: get_sizes
|
||||
uses: TiddlyWiki/cerebrus@v8.1
|
||||
uses: TiddlyWiki/cerebrus@v7
|
||||
with:
|
||||
pr_number: ${{ github.event.pull_request.number }}
|
||||
repo: ${{ github.repository }}
|
||||
@@ -52,4 +52,4 @@ jobs:
|
||||
pr_size: '${{ needs.calculate-build-size.outputs.pr_size }}',
|
||||
base_size: '${{ needs.calculate-build-size.outputs.base_size }}'
|
||||
}
|
||||
});
|
||||
});
|
||||
2
.github/workflows/pr-comment-build-size.yml
vendored
@@ -25,7 +25,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Build and check size
|
||||
uses: TiddlyWiki/cerebrus@v8.1
|
||||
uses: TiddlyWiki/cerebrus@v7
|
||||
with:
|
||||
pr_number: ${{ inputs.pr_number }}
|
||||
repo: ${{ github.repository }}
|
||||
|
||||
4
.github/workflows/pr-validation.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
steps:
|
||||
# Step 1: Validate PR paths
|
||||
- name: Validate PR Paths
|
||||
uses: TiddlyWiki/cerebrus@v8.1
|
||||
uses: TiddlyWiki/cerebrus@v6
|
||||
with:
|
||||
pr_number: ${{ github.event.pull_request.number }}
|
||||
repo: ${{ github.repository }}
|
||||
@@ -26,7 +26,7 @@ jobs:
|
||||
|
||||
# Step 2: Validate change notes
|
||||
- name: Validate Change Notes
|
||||
uses: TiddlyWiki/cerebrus@v8
|
||||
uses: TiddlyWiki/cerebrus@v7
|
||||
with:
|
||||
pr_number: ${{ github.event.pull_request.number }}
|
||||
repo: ${{ github.repository }}
|
||||
|
||||
11
.gitignore
vendored
@@ -3,19 +3,10 @@
|
||||
.vs/
|
||||
.vscode/
|
||||
.claude/
|
||||
# TiddlyWiki
|
||||
tmp/
|
||||
output/
|
||||
node_modules/
|
||||
$__StoryList.tid
|
||||
# Playwright
|
||||
/test-results/
|
||||
/playwright-report/
|
||||
/blob-report/
|
||||
/playwright/.cache/
|
||||
/playwright/.auth/
|
||||
test-screenshots/
|
||||
test-output.txt
|
||||
.playwright-mcp
|
||||
# TiddlyWiki MPC
|
||||
.tw-mcp
|
||||
$__StoryList.tid
|
||||
|
||||
10
boot/boot.js
@@ -47,13 +47,6 @@ $tw.utils.hop = function(object,property) {
|
||||
/** @deprecated Use Array.isArray instead */
|
||||
$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.
|
||||
*/
|
||||
@@ -131,6 +124,9 @@ $tw.utils.pushTop = function(array,value) {
|
||||
return array;
|
||||
};
|
||||
|
||||
/** @deprecated Use instanceof Date instead */
|
||||
$tw.utils.isDate = (value) => value instanceof Date;
|
||||
|
||||
/** @deprecated Use array iterative methods instead */
|
||||
$tw.utils.each = function(object,callback) {
|
||||
if(object) {
|
||||
|
||||
@@ -107,7 +107,7 @@ exports.parseStringLiteral = function(source,pos) {
|
||||
type: "string",
|
||||
start: pos
|
||||
};
|
||||
var reString = /(?:"""([\s\S]*?)"""|"([^"]*)")|(?:'([^']*)')|\[\[((?:[^\]]|\](?!\]))*)\]\]/y;
|
||||
var reString = /(?:"""([\s\S]*?)"""|"([^"]*)")|(?:'([^']*)')|\[\[((?:[^\]]|\](?!\]))*)\]\]/g;
|
||||
reString.lastIndex = pos;
|
||||
var match = reString.exec(source);
|
||||
if(match && match.index === pos) {
|
||||
@@ -221,7 +221,7 @@ exports.parseMacroInvocationAsTransclusion = function(source,pos) {
|
||||
orderedAttributes: []
|
||||
};
|
||||
// Define our regexps
|
||||
var reVarName = /([^\s>"'=:]+)/y;
|
||||
var reVarName = /([^\s>"'=:]+)/g;
|
||||
// Skip whitespace
|
||||
pos = $tw.utils.skipWhiteSpace(source,pos);
|
||||
// Look for a double opening angle bracket
|
||||
@@ -237,11 +237,9 @@ exports.parseMacroInvocationAsTransclusion = function(source,pos) {
|
||||
}
|
||||
$tw.utils.addAttributeToParseTreeNode(node,"$variable",token.match[1]);
|
||||
pos = token.end;
|
||||
// Check that the tag is terminated by a space or >>, and that there is a closing >> somewhere ahead
|
||||
if(!(source.charAt(pos) === ">" && source.charAt(pos + 1) === ">") ) {
|
||||
if(source.indexOf(">>",pos) === -1) {
|
||||
return null;
|
||||
}
|
||||
// Check that the tag is terminated by a space or >>
|
||||
if(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === ">" && source.charAt(pos + 1) === ">") ) {
|
||||
return null;
|
||||
}
|
||||
// Process attributes
|
||||
pos = $tw.utils.parseMacroParametersAsAttributes(node,source,pos);
|
||||
@@ -269,7 +267,7 @@ exports.parseMVVReferenceAsTransclusion = function(source,pos) {
|
||||
orderedAttributes: []
|
||||
};
|
||||
// Define our regexps
|
||||
var reVarName = /([^\s>"'=:)]+)/y;
|
||||
var reVarName = /([^\s>"'=:)]+)/g;
|
||||
// Skip whitespace
|
||||
pos = $tw.utils.skipWhiteSpace(source,pos);
|
||||
// Look for a double opening parenthesis
|
||||
@@ -325,24 +323,18 @@ exports.parseMacroParameterAsAttribute = function(source,pos) {
|
||||
start: pos
|
||||
};
|
||||
// Define our regexps
|
||||
var reAttributeName = /([^\/\s>"'`=:]+)/y,
|
||||
reStrictIdentifier = /^[A-Za-z0-9\-_]+$/,
|
||||
reUnquotedAttribute = /((?:(?:>(?!>))|[^\s>"'])+)/y,
|
||||
reFilteredValue = /\{\{\{([\S\s]+?)\}\}\}/y,
|
||||
reIndirectValue = /\{\{([^\}]+)\}\}/y,
|
||||
reSubstitutedValue = /(?:```([\s\S]*?)```|`([^`]|[\S\s]*?)`)/y;
|
||||
var reAttributeName = /([^\/\s>"'`=:]+)/g,
|
||||
reUnquotedAttribute = /((?:(?:>(?!>))|[^\s>"'])+)/g,
|
||||
reFilteredValue = /\{\{\{([\S\s]+?)\}\}\}/g,
|
||||
reIndirectValue = /\{\{([^\}]+)\}\}/g,
|
||||
reSubstitutedValue = /(?:```([\s\S]*?)```|`([^`]|[\S\s]*?)`)/g;
|
||||
// Skip whitespace
|
||||
pos = $tw.utils.skipWhiteSpace(source,pos);
|
||||
// Get the attribute name and the separator token
|
||||
var nameToken = $tw.utils.parseTokenRegExp(source,pos,reAttributeName),
|
||||
namePos = nameToken && $tw.utils.skipWhiteSpace(source,nameToken.end),
|
||||
separatorToken = nameToken && $tw.utils.parseTokenRegExp(source,namePos,/=|:/y),
|
||||
separatorToken = nameToken && $tw.utils.parseTokenRegExp(source,namePos,/=|:/g),
|
||||
isNewStyleSeparator = false; // If there is no separator then we don't allow new style values
|
||||
// Colon separator requires a strict identifier name to avoid mis-parsing values like $:/foo
|
||||
if(nameToken && separatorToken && separatorToken.match[0] === ":" && !reStrictIdentifier.test(nameToken.match[1])) {
|
||||
nameToken = null;
|
||||
separatorToken = null;
|
||||
}
|
||||
// If we have a name and a separator then we have a named attribute
|
||||
if(nameToken && separatorToken) {
|
||||
node.name = nameToken.match[1];
|
||||
@@ -353,78 +345,64 @@ exports.parseMacroParameterAsAttribute = function(source,pos) {
|
||||
}
|
||||
// Skip whitespace
|
||||
pos = $tw.utils.skipWhiteSpace(source,pos);
|
||||
|
||||
do {
|
||||
// Look for a string literal
|
||||
var stringLiteral = $tw.utils.parseStringLiteral(source,pos);
|
||||
if(stringLiteral) {
|
||||
pos = stringLiteral.end;
|
||||
node.type = "string";
|
||||
node.value = stringLiteral.value;
|
||||
// Mark the value as having been quoted in the source
|
||||
node.quoted = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if(isNewStyleSeparator) {
|
||||
// Look for a filtered value
|
||||
var filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);
|
||||
if(filteredValue) {
|
||||
pos = filteredValue.end;
|
||||
node.type = "filtered";
|
||||
node.filter = filteredValue.match[1];
|
||||
break;
|
||||
}
|
||||
|
||||
// Look for a string literal
|
||||
var stringLiteral = $tw.utils.parseStringLiteral(source,pos);
|
||||
if(stringLiteral) {
|
||||
pos = stringLiteral.end;
|
||||
node.type = "string";
|
||||
node.value = stringLiteral.value;
|
||||
// Mark the value as having been quoted in the source
|
||||
node.quoted = true;
|
||||
} else {
|
||||
// Look for a filtered value
|
||||
var filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);
|
||||
if(filteredValue && isNewStyleSeparator) {
|
||||
pos = filteredValue.end;
|
||||
node.type = "filtered";
|
||||
node.filter = filteredValue.match[1];
|
||||
} else {
|
||||
// Look for an indirect value
|
||||
var indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);
|
||||
if(indirectValue) {
|
||||
if(indirectValue && isNewStyleSeparator) {
|
||||
pos = indirectValue.end;
|
||||
node.type = "indirect";
|
||||
node.textReference = indirectValue.match[1];
|
||||
break;
|
||||
}
|
||||
|
||||
// Look for a macro invocation value
|
||||
var macroInvocation = $tw.utils.parseMacroInvocationAsTransclusion(source,pos);
|
||||
if(macroInvocation) {
|
||||
pos = macroInvocation.end;
|
||||
node.type = "macro";
|
||||
node.value = macroInvocation;
|
||||
break;
|
||||
}
|
||||
|
||||
// Look for an MVV reference value
|
||||
var mvvReference = $tw.utils.parseMVVReferenceAsTransclusion(source,pos);
|
||||
if(mvvReference) {
|
||||
pos = mvvReference.end;
|
||||
node.type = "macro";
|
||||
node.value = mvvReference;
|
||||
node.isMVV = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Look for a substituted value
|
||||
var substitutedValue = $tw.utils.parseTokenRegExp(source,pos,reSubstitutedValue);
|
||||
if(substitutedValue) {
|
||||
pos = substitutedValue.end;
|
||||
node.type = "substituted";
|
||||
node.rawValue = substitutedValue.match[1] || substitutedValue.match[2];
|
||||
break;
|
||||
} else {
|
||||
// Look for a macro invocation value
|
||||
var macroInvocation = $tw.utils.parseMacroInvocationAsTransclusion(source,pos);
|
||||
if(macroInvocation && isNewStyleSeparator) {
|
||||
pos = macroInvocation.end;
|
||||
node.type = "macro";
|
||||
node.value = macroInvocation;
|
||||
} else {
|
||||
// Look for an MVV reference value
|
||||
var mvvReference = $tw.utils.parseMVVReferenceAsTransclusion(source,pos);
|
||||
if(mvvReference && isNewStyleSeparator) {
|
||||
pos = mvvReference.end;
|
||||
node.type = "macro";
|
||||
node.value = mvvReference;
|
||||
node.isMVV = true;
|
||||
} else {
|
||||
var substitutedValue = $tw.utils.parseTokenRegExp(source,pos,reSubstitutedValue);
|
||||
if(substitutedValue && isNewStyleSeparator) {
|
||||
pos = substitutedValue.end;
|
||||
node.type = "substituted";
|
||||
node.rawValue = substitutedValue.match[1] || substitutedValue.match[2];
|
||||
} else {
|
||||
// Look for a unquoted value
|
||||
var unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);
|
||||
if(unquotedValue) {
|
||||
pos = unquotedValue.end;
|
||||
node.type = "string";
|
||||
node.value = unquotedValue.match[1];
|
||||
} else {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Look for a unquoted value
|
||||
var unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);
|
||||
if(unquotedValue) {
|
||||
pos = unquotedValue.end;
|
||||
node.type = "string";
|
||||
node.value = unquotedValue.match[1];
|
||||
break; // redundant, but leaving for consistency
|
||||
}
|
||||
|
||||
} while(false);
|
||||
|
||||
}
|
||||
// Bail if we don't have a value
|
||||
if(!node.type) {
|
||||
return null;
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
/*\
|
||||
title: $:/core/modules/relinkers/tiddlers.js
|
||||
type: application/javascript
|
||||
module-type: relinker
|
||||
|
||||
Relinks the tags and list fields of tiddlers.
|
||||
|
||||
Calls a tw-relinking-tiddler hook for every altered tiddler.
|
||||
|
||||
\*/
|
||||
|
||||
exports.name = "tiddlers";
|
||||
|
||||
exports.relink = function(wiki,fromTitle,toTitle,options) {
|
||||
wiki.each(function(tiddler,title) {
|
||||
var type = tiddler.fields.type || "";
|
||||
// Don't touch plugins or JavaScript modules
|
||||
if(!tiddler.fields["plugin-type"] && type !== "application/javascript") {
|
||||
var tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,
|
||||
list = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,
|
||||
isModified = false,
|
||||
processList = function(listField) {
|
||||
if(listField && listField.indexOf(fromTitle) !== -1) {
|
||||
// Remove any existing instances of the toTitle
|
||||
var p = listField.indexOf(toTitle);
|
||||
while(p !== -1) {
|
||||
listField.splice(p,1);
|
||||
p = listField.indexOf(toTitle);
|
||||
}
|
||||
// Replace the fromTitle with toTitle
|
||||
$tw.utils.each(listField,function (title,index) {
|
||||
if(title === fromTitle) {
|
||||
listField[index] = toTitle;
|
||||
isModified = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
if(!options.dontRenameInTags) {
|
||||
// Rename tags
|
||||
processList(tags);
|
||||
}
|
||||
if(!options.dontRenameInLists) {
|
||||
// Rename lists
|
||||
processList(list);
|
||||
}
|
||||
if(isModified) {
|
||||
var newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},wiki.getModificationFields());
|
||||
newTiddler = $tw.hooks.invokeHook("th-relinking-tiddler",newTiddler,tiddler);
|
||||
wiki.addTiddler(newTiddler);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
@@ -61,7 +61,7 @@ LogWidget.prototype.log = function() {
|
||||
$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {
|
||||
if(name.substring(0,2) !== "$$") {
|
||||
var resultList = self.computeAttribute(attribute,{asList: true});
|
||||
if(resultList && resultList.length <= 1) {
|
||||
if(resultList.length <= 1) {
|
||||
data[name] = resultList[0] || "";
|
||||
} else {
|
||||
data[name] = resultList;
|
||||
@@ -75,7 +75,7 @@ LogWidget.prototype.log = function() {
|
||||
allVars[v] = variable.value;
|
||||
} else {
|
||||
var variableInfo = this.getVariableInfo(v);
|
||||
allVars[v] = variableInfo && variableInfo.resultList && variableInfo.resultList.length > 1 ? variableInfo.resultList : variableInfo.text;
|
||||
allVars[v] = variableInfo.resultList.length > 1 ? variableInfo.resultList : variableInfo.text;
|
||||
}
|
||||
}
|
||||
if(this.filter) {
|
||||
|
||||
@@ -189,7 +189,7 @@ Widget.prototype.getVariableInfo = function(name,options) {
|
||||
}
|
||||
return {
|
||||
text: text,
|
||||
resultList: text === undefined ? text : [text]
|
||||
resultList: [text]
|
||||
};
|
||||
};
|
||||
|
||||
@@ -338,7 +338,7 @@ Widget.prototype.makeFakeWidgetWithVariables = function(vars = {}) {
|
||||
const value = vars[name];
|
||||
return Array.isArray(value)
|
||||
? { text: value[0], resultList: value }
|
||||
: { text: value, resultList: value === undefined ? value : [value] };
|
||||
: { text: value, resultList: [value] };
|
||||
}
|
||||
opts = opts || {};
|
||||
opts.variables = Object.assign({}, vars, opts.variables || {});
|
||||
|
||||
@@ -9,7 +9,6 @@ Bulk tiddler operations such as rename.
|
||||
|
||||
"use strict";
|
||||
|
||||
var relinkers = $tw.modules.getModulesByTypeAsHashmap("relinker");
|
||||
/*
|
||||
Rename a tiddler, and relink any tags or lists that reference it.
|
||||
*/
|
||||
@@ -33,13 +32,50 @@ function renameTiddler(fromTitle,toTitle,options) {
|
||||
Relink any tags or lists that reference a given tiddler
|
||||
*/
|
||||
function relinkTiddler(fromTitle,toTitle,options) {
|
||||
var self = this;
|
||||
fromTitle = (fromTitle || "").trim();
|
||||
toTitle = (toTitle || "").trim();
|
||||
options = options || {};
|
||||
if(fromTitle && toTitle && fromTitle !== toTitle) {
|
||||
for(var name in relinkers) {
|
||||
relinkers[name].relink(this,fromTitle,toTitle,options);
|
||||
}
|
||||
this.each(function(tiddler,title) {
|
||||
var type = tiddler.fields.type || "";
|
||||
// Don't touch plugins or JavaScript modules
|
||||
if(!tiddler.fields["plugin-type"] && type !== "application/javascript") {
|
||||
var tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,
|
||||
list = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,
|
||||
isModified = false,
|
||||
processList = function(listField) {
|
||||
if(listField && listField.indexOf(fromTitle) !== -1) {
|
||||
// Remove any existing instances of the toTitle
|
||||
var p = listField.indexOf(toTitle);
|
||||
while(p !== -1) {
|
||||
listField.splice(p,1);
|
||||
p = listField.indexOf(toTitle);
|
||||
}
|
||||
// Replace the fromTitle with toTitle
|
||||
$tw.utils.each(listField,function (title,index) {
|
||||
if(title === fromTitle) {
|
||||
listField[index] = toTitle;
|
||||
isModified = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
if(!options.dontRenameInTags) {
|
||||
// Rename tags
|
||||
processList(tags);
|
||||
}
|
||||
if(!options.dontRenameInLists) {
|
||||
// Rename lists
|
||||
processList(list);
|
||||
}
|
||||
if(isModified) {
|
||||
var newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields());
|
||||
newTiddler = $tw.hooks.invokeHook("th-relinking-tiddler",newTiddler,tiddler);
|
||||
self.addTiddler(newTiddler);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
title: $:/core/ui/EditTemplate/body/toolbar/button
|
||||
|
||||
\whitespace trim
|
||||
|
||||
\define toolbar-button-icon()
|
||||
<$list
|
||||
|
||||
|
||||
@@ -17,13 +17,11 @@ tags: $:/tags/EditTemplate
|
||||
<$let backgroundColor=<<colour>> >
|
||||
<span class="tc-tag-label tc-tag-list-item tc-small-gap-right"
|
||||
data-tag-title=<<currentTiddler>>
|
||||
style=`color:$(foregroundColor)$; fill:$(foregroundColor)$; background-color:$(backgroundColor)$;`
|
||||
style=`color:$(foregroundColor)$; background-color:$(backgroundColor)$; --tp-remove-tag-button-color:$(foregroundColor)$`
|
||||
>
|
||||
<$transclude tiddler=<<icon>>/>
|
||||
<$view field="title" format="text"/>
|
||||
<$button class="tc-btn-invisible tc-remove-tag-button"
|
||||
style.fill=<<foregroundColor>>
|
||||
>
|
||||
<$button class="tc-btn-invisible tc-remove-tag-button">
|
||||
<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter="-[{!!title}]"/>
|
||||
{{$:/core/images/close-button}}
|
||||
</$button>
|
||||
|
||||
@@ -2,7 +2,7 @@ title: $:/core/ui/ViewTemplate/title
|
||||
tags: $:/tags/ViewTemplate
|
||||
|
||||
\whitespace trim
|
||||
\define title-styles() fill:$(foregroundColor)$;
|
||||
\define title-styles() color:$(foregroundColor)$;
|
||||
|
||||
<div class="tc-tiddler-title tc-clearfix">
|
||||
<div class="tc-titlebar">
|
||||
|
||||
@@ -3,7 +3,6 @@ tags: $:/tags/Macro
|
||||
|
||||
\define tag-pill-styles()
|
||||
background-color:$(backgroundColor)$;
|
||||
fill:$(foregroundColor)$;
|
||||
color:$(foregroundColor)$;
|
||||
\end
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ tags: $:/tags/Macro
|
||||
style="width:$width$px;height:$height$px;background-color:$background-color$;"
|
||||
></$reveal></div><div
|
||||
class="tc-thumbnail-icon"
|
||||
style="fill:$color$;color:$color$;"
|
||||
style="color:$color$;"
|
||||
>$icon$</div><div class="tc-thumbnail-caption">$caption$</div></div></$link>
|
||||
\end
|
||||
|
||||
|
||||
@@ -19,7 +19,6 @@ type: text/vnd.tiddlywiki
|
||||
!! Update Readmes and release note
|
||||
|
||||
# Edit `package.json` to the new version number
|
||||
# Run `npm install` to update the `package-lock.json` file
|
||||
# Run `./bin/readme-bld.sh` to build the readme files
|
||||
# Commit the new readme files to ''master''
|
||||
# Restore `package.json` to the previous version number
|
||||
|
||||
@@ -2,6 +2,7 @@ created: 20131127215321439
|
||||
modified: 20140912135951542
|
||||
title: $:/DefaultTiddlers
|
||||
|
||||
[[Hire the founder of TiddlyWiki]]
|
||||
[[TiddlyWiki Pre-release]]
|
||||
HelloThere
|
||||
[[Quick Start]]
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
title: Procedures/Calls
|
||||
description: Procedure Calls
|
||||
type: text/vnd.tiddlywiki-multiple
|
||||
tags: [[$:/tags/wiki-test-spec]]
|
||||
|
||||
title: Output
|
||||
|
||||
\procedure test(param)
|
||||
<$text text=<<param>>/>
|
||||
\end test
|
||||
|
||||
-
|
||||
<<test Hello>>
|
||||
-
|
||||
<<test"Hello">>
|
||||
-
|
||||
<<test'Hello'>>
|
||||
-
|
||||
+
|
||||
title: ExpectedResult
|
||||
|
||||
<p>-
|
||||
Hello
|
||||
-
|
||||
Hello
|
||||
-
|
||||
Hello
|
||||
-</p>
|
||||
@@ -1,13 +0,0 @@
|
||||
title: Transclude/MissingTiddlerAttributeVariable
|
||||
description: Missing Tiddler Attribute Variable
|
||||
type: text/vnd.tiddlywiki-multiple
|
||||
tags: [[$:/tags/wiki-test-spec]]
|
||||
|
||||
title: Output
|
||||
description: hello
|
||||
|
||||
<$transclude tiddler=<<nonExistentVariable>> field="description"/>
|
||||
+
|
||||
title: ExpectedResult
|
||||
|
||||
<p>hello</p>
|
||||
@@ -1,22 +0,0 @@
|
||||
title: Transclude/Procedures/Dollar/Param
|
||||
description: Procedure call with unquoted parameter containing dollar-colon ($:) prefix should not be parsed as a named parameter
|
||||
type: text/vnd.tiddlywiki-multiple
|
||||
tags: [[$:/tags/wiki-test-spec]]
|
||||
|
||||
title: Output
|
||||
|
||||
\whitespace trim
|
||||
\procedure test(a, b)
|
||||
<<a>>--<<b>>
|
||||
\end
|
||||
|
||||
<<test 1 2>>
|
||||
|
||||
<<test 1 $:/foo>>
|
||||
|
||||
<<test $:/foo $:/bar>>
|
||||
|
||||
+
|
||||
title: ExpectedResult
|
||||
|
||||
<p>1–2</p><p>1–<a class="tc-tiddlylink tc-tiddlylink-missing" href="#%24%3A%2Ffoo">$:/foo</a></p><p><a class="tc-tiddlylink tc-tiddlylink-missing" href="#%24%3A%2Ffoo">$:/foo</a>–<a class="tc-tiddlylink tc-tiddlylink-missing" href="#%24%3A%2Fbar">$:/bar</a></p>
|
||||
@@ -28,7 +28,7 @@ describe("Backlinks tests", function() {
|
||||
}
|
||||
|
||||
describe("a tiddler with no links to it", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "TestIncoming",
|
||||
|
||||
@@ -10,7 +10,7 @@ Tests the backtranscludes mechanism.
|
||||
|
||||
describe("Backtranscludes and transclude filter tests", function() {
|
||||
describe("a tiddler with no transcludes to it", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "TestIncoming",
|
||||
@@ -25,7 +25,7 @@ describe("Backtranscludes and transclude filter tests", function() {
|
||||
});
|
||||
|
||||
describe("A tiddler added to the wiki with a transclude to it", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "TestIncoming",
|
||||
@@ -44,7 +44,7 @@ describe("Backtranscludes and transclude filter tests", function() {
|
||||
});
|
||||
|
||||
describe("A tiddler transclude with template will still use the tiddler as result.", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "TestIncoming",
|
||||
@@ -60,7 +60,7 @@ describe("Backtranscludes and transclude filter tests", function() {
|
||||
});
|
||||
|
||||
describe("A data tiddler transclude will still use the tiddler as result.", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "TestIncoming",
|
||||
@@ -81,7 +81,7 @@ describe("Backtranscludes and transclude filter tests", function() {
|
||||
|
||||
describe("A tiddler that has a transclude added to it later", function() {
|
||||
it("should have an additional backtransclude", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "TestIncoming",
|
||||
@@ -106,7 +106,7 @@ describe("Backtranscludes and transclude filter tests", function() {
|
||||
});
|
||||
|
||||
describe("A tiddler that has a transclude remove from it later", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "TestIncoming",
|
||||
@@ -128,7 +128,7 @@ describe("Backtranscludes and transclude filter tests", function() {
|
||||
});
|
||||
|
||||
describe("A tiddler transcludeing to another that gets renamed", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "TestIncoming",
|
||||
@@ -148,7 +148,7 @@ describe("Backtranscludes and transclude filter tests", function() {
|
||||
});
|
||||
|
||||
describe("A tiddler transcludeing to another that gets deleted", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "TestIncoming",
|
||||
@@ -168,7 +168,7 @@ describe("Backtranscludes and transclude filter tests", function() {
|
||||
});
|
||||
|
||||
describe("a tiddler with some transcludes on it in order", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "TestOutgoing",
|
||||
@@ -186,7 +186,7 @@ describe("Backtranscludes and transclude filter tests", function() {
|
||||
});
|
||||
|
||||
describe("include implicit self transclusion", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "TestOutgoing",
|
||||
@@ -202,7 +202,7 @@ describe("Backtranscludes and transclude filter tests", function() {
|
||||
});
|
||||
|
||||
describe("include explicit self transclusion", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "TestOutgoing",
|
||||
@@ -218,7 +218,7 @@ describe("Backtranscludes and transclude filter tests", function() {
|
||||
});
|
||||
|
||||
describe("exclude self when target tiddler is not string", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "TestOutgoing",
|
||||
@@ -234,7 +234,7 @@ describe("Backtranscludes and transclude filter tests", function() {
|
||||
});
|
||||
|
||||
describe("recognize transclusion defined by widget", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "TestOutgoing",
|
||||
|
||||
@@ -534,7 +534,7 @@ describe("Checkbox widget", function() {
|
||||
it("checkbox widget test: " + data.testName, function() {
|
||||
// Setup
|
||||
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
wiki.addTiddlers(data.tiddlers);
|
||||
var widgetNode = createWidgetNode(parseText(data.widgetText,wiki),wiki);
|
||||
renderWidgetNode(widgetNode);
|
||||
|
||||
@@ -13,7 +13,7 @@ Tests the compare filter.
|
||||
|
||||
describe("'compare' filter tests", function() {
|
||||
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
it("should compare numerical equality", function() {
|
||||
expect(wiki.filterTiddlers("[[2]compare:number:eq[0003]]").join(",")).toBe("");
|
||||
|
||||
@@ -583,7 +583,7 @@ describe("Filter tests", function() {
|
||||
});
|
||||
|
||||
it("should handle the '[is[draft]]' operator", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
wiki.addTiddlers([
|
||||
{title: "A"},
|
||||
{title: "Draft of 'A'", "draft.of": "A", "draft.title": "A"},
|
||||
|
||||
@@ -13,7 +13,7 @@ Tests the JSON filters and the format:json operator
|
||||
|
||||
describe("json filter tests", function() {
|
||||
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var tiddlers = [{
|
||||
title: "First",
|
||||
text: '{"a":"one","b":"","c":1.618,"d": {"e": "four","f": ["five","six",true,false,null]}}',
|
||||
|
||||
@@ -12,7 +12,7 @@ Tests for source attribute in parser returned from wiki.parseTextReference
|
||||
describe("Wiki.parseTextReference tests", function() {
|
||||
|
||||
// Create a wiki
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
wiki.addTiddler({
|
||||
title: "TiddlerOne",
|
||||
text: "The quick brown fox in $:/TiddlerTwo",
|
||||
|
||||
@@ -14,7 +14,7 @@ Tests the reduce prefix and filter.
|
||||
|
||||
describe("general filter prefix tests", function() {
|
||||
it("should handle nonexistent prefixes gracefully", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var results = wiki.filterTiddlers("[tag[A]] :nonexistent[tag[B]]");
|
||||
expect(results).toEqual(["Filter Error: Unknown prefix for filter run"]);
|
||||
});
|
||||
@@ -215,7 +215,7 @@ describe("general filter prefix tests", function() {
|
||||
|
||||
describe("'reduce' and 'intersection' filter prefix tests", function() {
|
||||
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
wiki.addTiddler({
|
||||
title: "Brownies",
|
||||
|
||||
@@ -82,7 +82,7 @@ describe("Utility tests", function() {
|
||||
});
|
||||
|
||||
it("stringifyList shouldn't interfere with setting variables to negative numbers", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
wiki.addTiddler({title: "test", text: "<$set name=X filter='\"-7\"'>{{{ [<X>add[2]] }}}</$set>"});
|
||||
// X shouldn't be wrapped in brackets. If it is, math filters will treat it as zero.
|
||||
expect(wiki.renderTiddler("text/plain","test")).toBe("-5");
|
||||
|
||||
@@ -19,7 +19,7 @@ describe("Widget Event Listeners", function() {
|
||||
|
||||
it("should call all added event listeners on dispatchEvent", function() {
|
||||
var calls = [];
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var widget = createWidgetNode({type:"widget", text:"text"}, wiki);
|
||||
|
||||
// Add a function listener.
|
||||
@@ -44,7 +44,7 @@ describe("Widget Event Listeners", function() {
|
||||
|
||||
it("should remove an event listener correctly", function() {
|
||||
var calls = [];
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var widget = createWidgetNode({type:"widget", text:"text"}, wiki);
|
||||
|
||||
function listener(e) {
|
||||
@@ -70,7 +70,7 @@ describe("Widget Event Listeners", function() {
|
||||
|
||||
it("stop further propagation by returns false won't block other listeners on the same level.", function() {
|
||||
var calls = [];
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var widget = createWidgetNode({type:"widget", text:"text"}, wiki);
|
||||
|
||||
widget.addEventListener("stopEvent", function(e) {
|
||||
@@ -92,7 +92,7 @@ describe("Widget Event Listeners", function() {
|
||||
|
||||
it("should dispatch event to parent widget if not handled on child", function() {
|
||||
var parentCalls = [];
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var parentWidget = createWidgetNode({type:"widget", text:"text"}, wiki);
|
||||
parentWidget.addEventListener("parentEvent", function(e) {
|
||||
parentCalls.push("parentListener");
|
||||
@@ -110,7 +110,7 @@ describe("Widget Event Listeners", function() {
|
||||
|
||||
it("should not dispatch event to parent if child's listener stops propagation", function() {
|
||||
var parentCalls = [];
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var parentWidget = createWidgetNode({type:"widget", text:"text"}, wiki);
|
||||
parentWidget.addEventListener("bubbleTest", function(e) {
|
||||
parentCalls.push("parentListener");
|
||||
@@ -128,7 +128,7 @@ describe("Widget Event Listeners", function() {
|
||||
|
||||
it("should call multiple listeners in proper order across child and parent", function() {
|
||||
var calls = [];
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var parentWidget = createWidgetNode({type:"widget", text:"text"}, wiki);
|
||||
parentWidget.addEventListener("chainEvent", function(e) {
|
||||
calls.push("parentListener");
|
||||
@@ -152,7 +152,7 @@ describe("Widget Event Listeners", function() {
|
||||
it("should handle events of different types separately", function() {
|
||||
var callsA = [];
|
||||
var callsB = [];
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var widget = createWidgetNode({type:"widget", text:"text"}, wiki);
|
||||
widget.addEventListener("eventA", function(e) {
|
||||
callsA.push("A1");
|
||||
@@ -171,7 +171,7 @@ describe("Widget Event Listeners", function() {
|
||||
// Test using $tw.utils.each in removeEventListener internally (behavior verified via dispatch)
|
||||
it("should remove listeners using $tw.utils.each without affecting other listeners", function() {
|
||||
var calls = [];
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var widget = createWidgetNode({type:"widget", text:"text"}, wiki);
|
||||
function listener1(e) {
|
||||
calls.push("listener1");
|
||||
@@ -192,7 +192,7 @@ describe("Widget Event Listeners", function() {
|
||||
|
||||
it("should prevent adding the same event listener multiple times", function() {
|
||||
var calls = 0;
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var widget = createWidgetNode({type:"widget", text:"text"}, wiki);
|
||||
|
||||
function listener(e) {
|
||||
|
||||
@@ -45,7 +45,7 @@ describe("Widget module", function() {
|
||||
}
|
||||
|
||||
it("should deal with text nodes and HTML elements", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Test parse tree
|
||||
var parseTreeNode = {type: "widget", children: [
|
||||
{type: "text", text: "A text node"},
|
||||
@@ -77,7 +77,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should deal with transclude widgets and indirect attributes", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add a tiddler
|
||||
wiki.addTiddlers([
|
||||
{title: "TiddlerOne", text: "the quick brown fox"}
|
||||
@@ -137,7 +137,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should detect recursion of the transclude macro", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add a tiddler
|
||||
wiki.addTiddlers([
|
||||
{title: "TiddlerOne", text: "<$transclude tiddler='TiddlerTwo'/>"},
|
||||
@@ -158,7 +158,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should handle single-tiddler recursion with branching nodes", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add a tiddler
|
||||
wiki.addTiddlers([
|
||||
{title: "TiddlerOne", text: "<$tiddler tiddler='TiddlerOne'><$transclude /> <$transclude /></$tiddler>"},
|
||||
@@ -182,7 +182,7 @@ describe("Widget module", function() {
|
||||
// end up being the same value for all iterations of the test.
|
||||
$tw.utils.each(["div","$button","$checkbox","$diff-text","$draggable","$droppable","dropzone","$eventcatcher","$keyboard","$link","$list filter=x variable=x","$radio","$reveal type=nomatch","$scrollable","$select","$view field=x"],function(tag) {
|
||||
it(`${tag} cleans itself up if children rendering fails`, function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
wiki.addTiddler({title: "TiddlerOne", text: `<$tiddler tiddler='TiddlerOne'><${tag}><$transclude />`});
|
||||
var parseTreeNode = {type: "widget", children: [
|
||||
{type: "transclude", attributes: {
|
||||
@@ -204,7 +204,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should handle many-tiddler recursion with branching nodes", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add a tiddler
|
||||
wiki.addTiddlers([
|
||||
{title: "TiddlerOne", text: "<$transclude tiddler='TiddlerTwo'/> <$transclude tiddler='TiddlerTwo'/>"},
|
||||
@@ -225,7 +225,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should deal with SVG elements", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Construct the widget node
|
||||
var text = "<svg class=\"tv-image-new-button\" viewBox=\"83 81 50 50\" width=\"22pt\" height=\"22pt\"><path d=\"M 101.25 112.5 L 101.25 127.5 C 101.25 127.5 101.25 127.5 101.25 127.5 L 101.25 127.5 C 101.25 129.156855 102.593146 130.5 104.25 130.5 L 111.75 130.5 C 113.406854 130.5 114.75 129.156854 114.75 127.5 L 114.75 112.5 L 129.75 112.5 C 131.406854 112.5 132.75 111.156854 132.75 109.5 L 132.75 102 C 132.75 100.343146 131.406854 99 129.75 99 L 114.75 99 L 114.75 84 C 114.75 82.343146 113.406854 81 111.75 81 L 104.25 81 C 104.25 81 104.25 81 104.25 81 C 102.593146 81 101.25 82.343146 101.25 84 L 101.25 99 L 86.25 99 C 86.25 99 86.25 99 86.25 99 C 84.593146 99 83.25 100.343146 83.25 102 L 83.25 109.5 C 83.25 109.5 83.25 109.5 83.25 109.5 L 83.25 109.5 C 83.25 111.156855 84.593146 112.5 86.25 112.5 Z\"/></svg>\n";
|
||||
var widgetNode = createWidgetNode(parseText(text,wiki,{parseAsInline:true}),wiki);
|
||||
@@ -237,7 +237,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should parse and render transclusions", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add a tiddler
|
||||
wiki.addTiddlers([
|
||||
{title: "TiddlerOne", text: "Jolly Old World"},
|
||||
@@ -254,7 +254,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should render the view widget", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add a tiddler
|
||||
wiki.addTiddlers([
|
||||
{title: "TiddlerOne", text: "Jolly Old World"}
|
||||
@@ -283,7 +283,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should deal with the set widget", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add some tiddlers
|
||||
wiki.addTiddlers([
|
||||
{title: "TiddlerOne", text: "Jolly Old World"},
|
||||
@@ -313,7 +313,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should deal with the let widget", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
wiki.addTiddlers([
|
||||
{title: "TiddlerOne", text: "lookup"},
|
||||
{title: "TiddlerTwo", lookup: "value", newlookup: "value", wrong: "wrong"},
|
||||
@@ -347,7 +347,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should deal with attributes specified as macro invocations", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Construct the widget node
|
||||
var text = "\\define myMacro(one:\"paramOne\",two,three:\"paramTwo\")\nMy something $one$, $two$ or other $three$\n\\end\n<div class=<<myMacro 'something' three:'thing'>>>Content</div>";
|
||||
var widgetNode = createWidgetNode(parseText(text,wiki),wiki);
|
||||
@@ -358,7 +358,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should deal with built-in macros", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add some tiddlers
|
||||
wiki.addTiddlers([
|
||||
{title: "TiddlerOne", text: "Jolly Old World", type: "text/vnd.tiddlywiki"}
|
||||
@@ -374,7 +374,7 @@ describe("Widget module", function() {
|
||||
|
||||
/* This test reproduces issue #4693. */
|
||||
it("should render the entity widget", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Construct the widget node
|
||||
var text = "\n\n<$entity entity=' ' />\n\n<$entity entity='✓' />\n";
|
||||
var widgetNode = createWidgetNode(parseText(text,wiki),wiki);
|
||||
@@ -391,7 +391,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should deal with the list widget", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add some tiddlers
|
||||
wiki.addTiddlers([
|
||||
{title: "TiddlerOne", text: "Jolly Old World"},
|
||||
@@ -451,7 +451,7 @@ describe("Widget module", function() {
|
||||
|
||||
|
||||
it("should deal with the list widget using a counter variable", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add some tiddlers
|
||||
wiki.addTiddlers([
|
||||
{title: "TiddlerOne", text: "Jolly Old World"},
|
||||
@@ -593,7 +593,7 @@ describe("Widget module", function() {
|
||||
|
||||
var testListJoin = function(oldList, newList) {
|
||||
return function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add some tiddlers
|
||||
wiki.addTiddler({title: "Numbers", text: "", list: oldList});
|
||||
var text = "<$list filter='[list[Numbers]]' variable='item' join=', '><<item>></$list>";
|
||||
@@ -632,7 +632,7 @@ describe("Widget module", function() {
|
||||
|
||||
var testCounterLast = function(oldList, newList) {
|
||||
return function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add some tiddlers
|
||||
wiki.addTiddler({title: "Numbers", text: "", list: oldList});
|
||||
var text = "<$list filter='[list[Numbers]]' variable='item' counter='c'><<item>><$text text={{{ [<c-last>match[no]then[, ]] }}} /></$list>";
|
||||
@@ -654,7 +654,7 @@ describe("Widget module", function() {
|
||||
it("the list widget with counter-last should update correctly when first item is removed", testCounterLast("1 2 3 4", "2 3 4"));
|
||||
|
||||
it("should deal with the list widget followed by other widgets", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add some tiddlers
|
||||
wiki.addTiddlers([
|
||||
{title: "TiddlerOne", text: "Jolly Old World"},
|
||||
@@ -727,7 +727,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should deal with the list widget and external templates", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add some tiddlers
|
||||
wiki.addTiddlers([
|
||||
{title: "$:/myTemplate", text: "(<$view field='title'/>)"},
|
||||
@@ -747,7 +747,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should deal with the list widget and empty lists", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Construct the widget node
|
||||
var text = "<$list emptyMessage='nothing'><$view field='title'/></$list>";
|
||||
var widgetNode = createWidgetNode(parseText(text,wiki),wiki);
|
||||
@@ -758,7 +758,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should refresh lists that become empty", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add some tiddlers
|
||||
wiki.addTiddlers([
|
||||
{title: "TiddlerOne", text: "Jolly Old World"},
|
||||
@@ -788,7 +788,7 @@ describe("Widget module", function() {
|
||||
* if they use transclusion for their value. This relates to PR #4108.
|
||||
*/
|
||||
it("should refresh imported <$set> widgets", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add some tiddlers
|
||||
wiki.addTiddlers([
|
||||
{title: "Raw", text: "Initial value"},
|
||||
@@ -808,7 +808,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should support mixed setWidgets and macros when importing", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add some tiddlers
|
||||
wiki.addTiddlers([
|
||||
{title: "A", text: "\\define A() Aval"},
|
||||
@@ -824,7 +824,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should skip parameters widgets when importing", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add some tiddlers
|
||||
wiki.addTiddlers([
|
||||
{title: "B", text: "<$parameters bee=nothing><$set name='B' value='Bval'>\n\ndummy text</$set></$parameters>"},
|
||||
@@ -838,7 +838,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should use default $parameters if directly rendered", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var text = "<$parameters bee=default $$dollar=bill nothing empty=''>bee=<<bee>>, $dollar=<<$dollar>>, nothing=<<nothing>>, empty=<<empty>></$parameters>";
|
||||
var widgetNode = createWidgetNode(parseText(text,wiki),wiki);
|
||||
// Render the widget node to the DOM
|
||||
@@ -848,7 +848,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("should use default \\parameters if directly rendered", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var text = "\\parameters(bee:default $$dollar:bill nothing)\nbee=<<bee>>, $$dollar=<<$$dollar>>, nothing=<<nothing>>";
|
||||
var widgetNode = createWidgetNode(parseText(text,wiki),wiki);
|
||||
// Render the widget node to the DOM
|
||||
@@ -858,7 +858,7 @@ describe("Widget module", function() {
|
||||
});
|
||||
|
||||
it("can have more than one macroDef variable imported", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
wiki.addTiddlers([
|
||||
{title: "ABC", text: "<$set name=A value=A>\n\n<$set name=B value=B>\n\n<$set name=C value=C>\n\ndummy text</$set></$set></$set>"},
|
||||
{title: "D", text: "\\define D() D"}]);
|
||||
@@ -911,7 +911,7 @@ describe("Widget module", function() {
|
||||
* doesn't forget its childrenNodes.
|
||||
*/
|
||||
it("should work when import widget imports nothing", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var text = "\\import [prefix[XXX]]\nDon't forget me.";
|
||||
var widgetNode = createWidgetNode(parseText(text,wiki),wiki);
|
||||
// Render the widget node to the DOM
|
||||
@@ -925,7 +925,7 @@ describe("Widget module", function() {
|
||||
* visual difference, but may affect plugins if it doesn't.
|
||||
*/
|
||||
it("should work when import pragma is standalone", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
var text = "\\import [prefix[XXX]]";
|
||||
var parseTreeNode = parseText(text,wiki);
|
||||
// Test the resulting parse tree node, since there is no
|
||||
@@ -944,7 +944,7 @@ describe("Widget module", function() {
|
||||
* at least ONE variable.
|
||||
*/
|
||||
it("adding imported variables doesn't change qualifyers", function() {
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
function wikiparse(text) {
|
||||
var tree = parseText(text,wiki);
|
||||
var widgetNode = createWidgetNode(tree,wiki);
|
||||
|
||||
@@ -12,7 +12,7 @@ Tests for wikitext parser
|
||||
describe("WikiText parser tests", function() {
|
||||
|
||||
// Create a wiki
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
|
||||
// Define a parsing shortcut
|
||||
var parse = function(text) {
|
||||
|
||||
@@ -12,7 +12,7 @@ Tests the wikitext rendering pipeline end-to-end. We also need tests that indivi
|
||||
describe("WikiText tests", function() {
|
||||
|
||||
// Create a wiki
|
||||
var wiki = $tw.test.wiki();
|
||||
var wiki = new $tw.Wiki();
|
||||
// Add a couple of tiddlers
|
||||
wiki.addTiddler({title: "TiddlerOne", text: "The quick brown fox"});
|
||||
wiki.addTiddler({title: "TiddlerTwo", text: "The rain in Spain\nfalls mainly on the plain"});
|
||||
|
||||
@@ -193,11 +193,11 @@ tr.doc-table-subheading {
|
||||
}
|
||||
|
||||
.doc-block-icon .tc-image-tip {
|
||||
fill: <<colour primary>>;
|
||||
color: <<colour primary>>;
|
||||
}
|
||||
|
||||
.doc-block-icon .tc-image-warning {
|
||||
fill: <<colour alert-highlight>>;
|
||||
color: <<colour alert-highlight>>;
|
||||
}
|
||||
|
||||
a.doc-from-version {
|
||||
@@ -215,7 +215,6 @@ a.doc-from-version.doc-from-version-new {
|
||||
}
|
||||
|
||||
a.doc-from-version svg {
|
||||
fill: currentColor;
|
||||
vertical-align: sub;
|
||||
}
|
||||
|
||||
@@ -224,7 +223,6 @@ a.doc-deprecated-version.tc-tiddlylink {
|
||||
border-radius: 1em;
|
||||
background: red;
|
||||
color: <<colour background>>;
|
||||
fill: <<colour background>>;
|
||||
padding: 0 0.4em;
|
||||
font-size: 0.7em;
|
||||
text-transform: uppercase;
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
title: Donations
|
||||
tags: About HelloThere
|
||||
modified: 20260403103452943
|
||||
created: 20260403103452943
|
||||
|
||||
<a href="https://opencollective.com/tiddlywiki" class="tc-btn-invisible" target="_blank">
|
||||
{{TiddlyWiki Donation Graphic}}
|
||||
</a>
|
||||
|
||||
TiddlyWiki is a free and open source project, and we rely on your generous donations to cover hosting costs and to support the ongoing growth of the project.
|
||||
|
||||
You can donate here:
|
||||
|
||||
https://opencollective.com/tiddlywiki
|
||||
|
||||
See [[Funding TiddlyWiki]] for more information about TiddlyWiki's funding and how you can help support the project.
|
||||
@@ -36,7 +36,6 @@ type: text/vnd.tiddlywiki
|
||||
border-radius: 6px;
|
||||
padding: 0.5em;
|
||||
color: <<colour background>>;
|
||||
fill: <<colour background>>;
|
||||
}
|
||||
|
||||
.tc-cards.tc-action-card .tc-card-button svg {
|
||||
|
||||
@@ -4,23 +4,29 @@ tags: Community
|
||||
title: Forums
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
! User forums
|
||||
!!! Users
|
||||
|
||||
!! Talk ~TiddlyWiki
|
||||
|
||||
As the official ~TiddlyWiki forum, Talk ~TiddlyWiki is a place to talk about ~TiddlyWiki: requests for help, [[announcements|https://talk.tiddlywiki.org/c/announcements/20]] of new releases and plugins, debating new features, or just sharing experiences. You can participate via the associated website, or subscribe via email.
|
||||
The official TiddlyWiki forum is a place to talk about ~TiddlyWiki: requests for help, [[announcements|https://talk.tiddlywiki.org/c/announcements/20]] of new releases and plugins, debating new features, or just sharing experiences. You can participate via the associated website, or subscribe via email.
|
||||
|
||||
https://talk.tiddlywiki.org/
|
||||
|
||||
!! Google Groups
|
||||
Other Forums:
|
||||
|
||||
!!! Google Groups
|
||||
|
||||
<<<
|
||||
For the convenience of existing users, we also continue to operate the original ~TiddlyWiki group (hosted on Google Groups since 2005): https://groups.google.com/group/TiddlyWiki
|
||||
<<<
|
||||
|
||||
! Developer forums
|
||||
! Developer Forums
|
||||
|
||||
{{Developers}}
|
||||
|
||||
! Other forums
|
||||
! Other Forums
|
||||
|
||||
* TiddlyWiki Subreddit: [[/r/TiddlyWiki5|https://www.reddit.com/r/TiddlyWiki5/]]
|
||||
* Chat on Discord at https://discord.gg/HFFZVQ8
|
||||
* [[TiddlyWiki Subreddit|https://www.reddit.com/r/TiddlyWiki5/]]
|
||||
* Chat on Discord at https://discord.gg/HFFZVQ8
|
||||
|
||||
!! Developers
|
||||
|
||||
{{Developers}}
|
||||
@@ -37,5 +37,5 @@ Some icons take further parameters to customise how they are rendered. For examp
|
||||
|
||||
The core icons are implemented as embedded [[SVG elements|Using SVG]], and not as full-blown SVG images. This means that they can be styled using CSS. For example, the CSS property `fill` can be used to change the colour of the icons. For example:
|
||||
|
||||
<<wikitext-example-without-html """<span style="fill: red;">{{$:/core/images/opacity}}</span>
|
||||
<<wikitext-example-without-html """<span style="color: red;">{{$:/core/images/opacity}}</span>
|
||||
""">>
|
||||
|
||||
@@ -19,5 +19,3 @@ A <<.def "filter expression">> is the outermost level of the [[filter syntax|Fil
|
||||
<<.tip """If the diagram has a single start and end line, as shown above, it means there is more info in the linked level above. The breadcrumbs can be used to navigate""">>
|
||||
|
||||
<<.tip """If the diagram has no start and no end, as used in lower levels, it means that higher level syntax elements have been removed, to increase readability and simplicity. The breadcrumbs can be used to navigate""">>
|
||||
|
||||
<<.note """Filter expressions have a maximum recursion depth of 300. Filters that recursively invoke themselves (e.g. via the <<.olink subfilter>> or <<.olink filter>> operators) beyond this limit will return the error message `/**-- Excessive filter recursion --**/`. This protects against infinite loops.""">>
|
||||
|
||||
@@ -12,8 +12,6 @@ type: text/vnd.tiddlywiki
|
||||
"{" [: <-"indirect"-> /"anything but }"/] "}"
|
||||
|
|
||||
"<" [: <-"variable"-> /"anything but >"/] ">"
|
||||
|
|
||||
"(" [: <-"multi-valued variable"-> /"anything but )"/ ] ")" /"v5.4.0"/
|
||||
)
|
||||
"""/>
|
||||
|
||||
@@ -22,7 +20,6 @@ The parameter to a [[filter operator|Filter Operators]] can be:
|
||||
;<<.def hard>>
|
||||
: `[like this]`
|
||||
: The parameter is the exact text that appears between the square brackets.
|
||||
|
||||
;<<.def soft>>
|
||||
: <<.def indirect>>
|
||||
:: `{like this}`
|
||||
@@ -31,9 +28,6 @@ The parameter to a [[filter operator|Filter Operators]] can be:
|
||||
:: `<like this>`
|
||||
:: The parameter is the current value of the [[variable|Variables]] whose name appears between the angle brackets. Macro parameters are <<.em not>> supported up to v5.2.0
|
||||
::<<.from-version "5.2.0">> Literal macro parameters are supported. For example: `[<now [UTC]YYYY0MM0DD0hh0mm0ssXXX>]`.
|
||||
: <<.def "multi-valued variable">>
|
||||
:: `(like this)`
|
||||
:: <<.from-version "5.4.0">> The parameter expands to the complete list of values stored in the [[multi-valued variable|Multi-Valued Variables]] whose name appears between the round brackets. When accessed this way, the filter operator receives all values, not just the first. See [[Multi-Valued Variables]] for details.
|
||||
|
||||
<<.note """Every [[filter Operator]] must be followed by a parameter expression. In the case of [[Operators without parameters]], that expression is empty, as with the filter Operator <<.olink links>> in `[<currentTiddler>links[]]`.""">>
|
||||
|
||||
@@ -41,8 +35,4 @@ The parameter to a [[filter operator|Filter Operators]] can be:
|
||||
|
||||
<<.from-version "5.1.23">> [[Filter Step]]s support multiple parameters which are separated by a `,` character.
|
||||
|
||||
For example: `[param1],[param2]` or `<param1>,{param2}` or `[param1],(param2)`
|
||||
|
||||
---
|
||||
|
||||
<<.warning """The `/regexp/(flags)` operand syntax is deprecated and will log a warning to the browser console. Use the <<.olink regexp>> operator instead.""">>
|
||||
For example: `[param1],[param2]` or `<param1>,{param2}`
|
||||
|
||||
@@ -18,17 +18,17 @@ In programming terms, it is akin to a function call to which the step's input is
|
||||
{ [[parameter|"Filter Parameter"]] + "," }
|
||||
"""/>
|
||||
|
||||
The step's <<.def operator>> is drawn from a list of predefined keywords which are known as [[filter operators|Filter Operators]].
|
||||
The step's <<.def operator>> is drawn from a list of predefined keywoards which are known as [[filter operators|Filter Operators]].
|
||||
|
||||
Many steps require an explicit <<.def parameter>>, that further defines what the step is to do.
|
||||
|
||||
The <<.def suffix>> is additional text, often the name of a [[field|TiddlerFields]], that extends the meaning of certain operators. Suffixes are separated by `:` characters, and each suffix group can contain multiple comma-separated values. For example, in `compare:number:gteq`, the first suffix is `number` and the second is `gteq`. In `:sort:string:reverse,casesensitive`, the first suffix is `string` and the second suffix group contains both `reverse` and `casesensitive`.
|
||||
The <<.def suffix>> is additional text, often the name of a [[field|TiddlerFields]], that extends the meaning of certain operators.
|
||||
|
||||
If a step's <<.def operator>> and <<.def suffix>> are //omitted// altogether, it defaults to the [[title|title Operator]] operator. If a suffix is present but the operator name before the colon is empty (e.g. `[:fieldname[value]]`), the operator defaults to <<.olink field>>.
|
||||
If a step's <<.def operator>> and <<.def suffix>> are //omitted// altogether, it defaults to the [[title|title Operator]] operator.
|
||||
|
||||
<<.from-version "5.1.23">> Some steps accept multiple <<.def parameter>>s which are separated by a `,` character.
|
||||
|
||||
Any unrecognised operator is treated as if it was the suffix to the <<.olink field>> operator. <<.from-version "5.3.0">> However, unrecognised operators whose name contains a `.` (dot) character are treated as user-defined filter operators, resolved by looking up a variable or function with that name.
|
||||
Any unrecognised operator is treated as if it was the suffix to the <<.olink field>> operator.
|
||||
|
||||
Filter operators can be extended by plugins.
|
||||
|
||||
|
||||
@@ -43,5 +43,3 @@ For the difference between `+` and `:intersection`, see [[Intersection Filter Ru
|
||||
!! For Developers
|
||||
|
||||
To create a new filter run prefix, create a [[Javascript module|Modules]] with a [[module-type|ModuleType]] of `filterrunprefix`.
|
||||
|
||||
Compiled filter expressions are cached for performance. The cache holds up to 2000 entries and is reset in its entirety when this limit is exceeded.
|
||||
|
||||
@@ -15,15 +15,6 @@ type: text/vnd.tiddlywiki
|
||||
[[run|"Filter Run"]]
|
||||
"""/>
|
||||
|
||||
The filter output from previous runs is set aside. The `:intersection` filter run is started with all tiddler titles as input. Once this filter run has completed, the output is compared to the set-aside output. A new output is produced that contains only titles that appeared in both the set-aside output and the latest output. The order of titles in the output is preserved from the accumulated results.
|
||||
|
||||
!! Difference from `:and` / `+`
|
||||
|
||||
The key difference between `:intersection` and `:and` (or `+`) is what they receive as ''input'':
|
||||
|
||||
* `:and` / `+` feeds the ''accumulated results so far'' as input to the filter run. Operators in the run can only see and work with titles already in the results.
|
||||
* `:intersection` feeds ''all tiddler titles'' as input to the filter run (just like an unprefixed run), then keeps only titles that also appear in the accumulated results.
|
||||
|
||||
This means `:intersection` can match titles using operators that need to start from the full tiddler pool. See [[Interchangeable Filter Run Prefixes]] for more details.
|
||||
The filter output from previous runs is set aside. The `:intersection` filter run is started with all tiddler titles as input. Once this latest filter run has completed, the latest output is compared to the set-aside output. A new output is produced that contains only titles that appeared in both the set-aside output and the latest output.
|
||||
|
||||
[[Intersection Filter Run Prefix (Examples)]]
|
||||
|
||||
@@ -34,14 +34,4 @@ A named filter run prefix can precede any [[run|Filter Run]] of a [[filter expre
|
||||
|
||||
<<.tip """Within the filter runs prefixed with `:reduce`, `:sort`, `:map` and `:filter`, the <<.var currentTiddler>> variable is set to the title of the tiddler being processed.<br>The value of currentTiddler outside the subfilter is available in the variable <<.var "..currentTiddler">> <<.from-version "5.2.0">>""" >>
|
||||
|
||||
!! Suffixes
|
||||
|
||||
Named filter run prefixes can accept suffixes separated by `:` characters, each optionally containing comma-separated values. The general syntax is `:prefixname:suffix1:suffix2,...`. Currently the following prefixes accept suffixes:
|
||||
|
||||
|!Prefix |!Suffixes |!Example |
|
||||
|`:map` |`flat` — return all results instead of only the first per item |`:map:flat[...]` |
|
||||
|`:sort` |type (''string'', ''alphanumeric'', ''number'', ''integer'', ''version'', ''date'') and flags (''reverse'', ''casesensitive'', ''caseinsensitive'') |`:sort:number:reverse[...]` |
|
||||
|
||||
All other named prefixes (`:all`, `:and`, `:cascade`, `:else`, `:except`, `:filter`, `:intersection`, `:let`, `:or`, `:reduce`, `:then`) do not currently accept suffixes.
|
||||
|
||||
Also see: [[Interchangeable Filter Run Prefixes]]
|
||||
|
||||
@@ -21,10 +21,10 @@ If a run has:
|
||||
|
||||
* the prefix `-`, output titles are <<.em removed>> from the filter's output (if such tiddlers exist)
|
||||
|
||||
* the prefix `~`, <<.from-version "5.1.18">> if the filter output so far is an empty list then the output titles of the run are [[dominantly appended|Dominant Append]] to the filter's output. If the filter output so far is not an empty list then the run is ignored.
|
||||
* the prefix `~`, if the filter output so far is an empty list then the output titles of the run are [[dominantly appended|Dominant Append]] to the filter's output. If the filter output so far is not an empty list then the run is ignored. <<.from-version "5.1.18">>
|
||||
|
||||
* the prefix `=`, <<.from-version "5.1.20">> output titles are appended to the filter's output without de-duplication.
|
||||
* the prefix `=`, output titles are appended to the filter's output without de-duplication. <<.from-version "5.1.20">>
|
||||
|
||||
* the prefix `=>`, <<.from-version "5.4.0">> the accumulated results from all previous runs are assigned as a [[multi-valued variable|Multi-Valued Variables]] whose name is the first result of this run. The accumulated results are then cleared.
|
||||
* the prefix `=>`, the input is assigned to the variable named with the output title. <<.from-version "5.4.0">>
|
||||
|
||||
{{Interchangeable Filter Run Prefixes}}
|
||||
@@ -1,7 +1,7 @@
|
||||
created: 20210618133745003
|
||||
from-version: 5.3.0
|
||||
modified: 20230710074225410
|
||||
rp-input: <<.olink all>> tiddler titles (only evaluated when the output from previous runs is non-empty)
|
||||
rp-input: <<.olink all>> tiddler titles
|
||||
rp-output: the output of this filter run replaces the output of previous runs unless it is an empty list (see below)
|
||||
rp-purpose: replace any input to this filter run with its output, only evaluating the run when there is any input
|
||||
search:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
created: 20150414070451144
|
||||
list: [[HelloThumbnail - Donations]] [[HelloThumbnail - Newsletter]] [[HelloThumbnail - Community Survey 2025]] [[HelloThumbnail - Introduction Video]] [[HelloThumbnail - Grok TiddlyWiki]] [[HelloThumbnail - Latest Version]] [[HelloThumbnail - MultiWikiServer]] [[HelloThumbnail - Twenty Years of TiddlyWiki]] [[HelloThumbnail - TiddlyWiki Privacy]] [[HelloThumbnail - Marketplace]] [[HelloThumbnail - Intertwingled Innovations]] [[HelloThumbnail - TiddlyWikiLinks]]
|
||||
list: [[HelloThumbnail - Newsletter]] [[HelloThumbnail - Community Survey 2025]] [[HelloThumbnail - Introduction Video]] [[HelloThumbnail - Grok TiddlyWiki]] [[HelloThumbnail - Latest Version]] [[HelloThumbnail - MultiWikiServer]] [[HelloThumbnail - Twenty Years of TiddlyWiki]] [[HelloThumbnail - Funding]] [[HelloThumbnail - TiddlyWiki Privacy]] [[HelloThumbnail - Marketplace]] [[HelloThumbnail - Intertwingled Innovations]] [[HelloThumbnail - TiddlyWikiLinks]]
|
||||
modified: 20150414070948246
|
||||
title: HelloThumbnail
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
title: HelloThumbnail - Community Survey 2025
|
||||
tags: HelloThumbnail
|
||||
color: rgb(234, 205, 183)
|
||||
image: Community Survey 2025 Image
|
||||
image: Community Survey 2025
|
||||
caption: Community Survey
|
||||
link: Community Survey 2025
|
||||
ribbon-text: NEW
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
background-color: #EDB431
|
||||
caption: Help Support ~TiddlyWiki
|
||||
color: #ff0
|
||||
image: TiddlyWiki Donation Graphic
|
||||
link: Donations
|
||||
tags: HelloThumbnail
|
||||
title: HelloThumbnail - Donations
|
||||
|
||||
Find out how you can help support ~TiddlyWiki financially
|
||||
@@ -0,0 +1,9 @@
|
||||
background-color: #EDB431
|
||||
caption: How is ~TiddlyWiki Funded?
|
||||
color: #ff0
|
||||
image: Funding
|
||||
link: Funding TiddlyWiki
|
||||
tags: HelloThumbnail
|
||||
title: HelloThumbnail - Funding
|
||||
|
||||
Find out how you can help support ~TiddlyWiki financially
|
||||
@@ -1,7 +1,7 @@
|
||||
background-color: #EDB431
|
||||
caption: Intertwingled Innovations
|
||||
color: #ff0
|
||||
image: Intertwingled Innovations Image
|
||||
image: Intertwingled Innovations
|
||||
link: Intertwingled Innovations
|
||||
tags: HelloThumbnail
|
||||
title: HelloThumbnail - Intertwingled Innovations
|
||||
|
||||
@@ -4,7 +4,6 @@ caption: What's New in v<<version>>
|
||||
link: Releases
|
||||
image: New Release Banner
|
||||
color: #fff
|
||||
ribbon-text: NEW
|
||||
|
||||
\define prerelease-regexp() [0-9]+\.[0-9]+\.[0-9]+\-prerelease
|
||||
<$list filter="[<version>!regexp<prerelease-regexp>]" variable="ignore">
|
||||
|
||||
@@ -5,5 +5,6 @@ link: TiddlyWiki Newsletter
|
||||
image: TiddlyWiki Newsletter Badge
|
||||
color: #fff
|
||||
type: text/vnd.tiddlywiki
|
||||
ribbon-text: NEW
|
||||
|
||||
Subscribe to the ~TiddlyWiki Newsletter, a summary of the most interesting and relevant news from the ~TiddlyWiki community
|
||||
|
||||
@@ -81,7 +81,7 @@ type: text/vnd.tiddlywiki
|
||||
}
|
||||
|
||||
[data-tiddler-title="Hire the founder of TiddlyWiki"] .tc-btn-big-green svg {
|
||||
fill: #cece86;
|
||||
color: #cece86;
|
||||
}
|
||||
|
||||
.yellow-note-sidebar-wrapper {
|
||||
|
||||
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
@@ -1,4 +1,4 @@
|
||||
alt-text: Shape the future by taking the TiddlyWiki Community Survey 2025
|
||||
tags: picture
|
||||
title: Community Survey 2025 Image
|
||||
title: Community Survey 2025
|
||||
type: image/webp
|
||||
BIN
editions/tw5.com/tiddlers/images/Funding.webp
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
4
editions/tw5.com/tiddlers/images/Funding.webp.meta
Normal file
@@ -0,0 +1,4 @@
|
||||
title: Funding
|
||||
type: image/webp
|
||||
tags: picture
|
||||
alt-text: Hand over a debit-card.
|
||||
@@ -1,3 +0,0 @@
|
||||
title: Intertwingled Innovations Image
|
||||
type: image/webp
|
||||
tags: picture
|
||||
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
@@ -0,0 +1,3 @@
|
||||
title: Intertwingled Innovations
|
||||
type: image/webp
|
||||
tags: picture
|
||||
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 161 KiB |
|
Before Width: | Height: | Size: 60 KiB |
@@ -1,4 +0,0 @@
|
||||
alt-text: Motovun Jack appreciates incoming donations
|
||||
tags: picture
|
||||
title: TiddlyWiki Donation Graphic
|
||||
type: image/webp
|
||||
@@ -55,10 +55,8 @@ The text returned from a call can be directly assigned to an attribute of a widg
|
||||
|
||||
Calls can be used in filters. The text is not wikified which again means that the parameters will be ignored.
|
||||
|
||||
//Note that currently only literal string parameters are supported//
|
||||
|
||||
```
|
||||
<$list filter="[<my-procedure>]">
|
||||
...
|
||||
</$list>
|
||||
```
|
||||
```
|
||||
@@ -3,6 +3,6 @@ description: Fixed Flexoki palette regressions
|
||||
release: 5.3.8
|
||||
tags: $:/tags/ChangeNote
|
||||
change-type: bugfix
|
||||
change-category: plugin
|
||||
change-category: palette
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9175
|
||||
github-contributors: Leilei332
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
title: $:/changenotes/5.4.0/#8093
|
||||
description: Fixes SelectWidget does not work with multiple options organised into group - issue #8092
|
||||
description: Fix SelectWidget not working with multiple options organised into groups
|
||||
release: 5.4.0
|
||||
tags: $:/tags/ChangeNote
|
||||
change-type: bugfix
|
||||
@@ -7,4 +7,4 @@ change-category: widget
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/issues/8093 https://github.com/TiddlyWiki/TiddlyWiki5/pull/9616
|
||||
github-contributors: buggyj saqimtiaz
|
||||
|
||||
Fixed SelectWidget does not work with multiple options organised into group.
|
||||
Fixed a bug where the SelectWidget did not work correctly when multiple options were organised into groups.
|
||||
|
||||
@@ -10,16 +10,6 @@ tags: $:/tags/ChangeNote
|
||||
title: $:/changenotes/5.4.0/#8249
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
This PR changes the default ''AES encryption'' setting ''from 128 bit to 256'' bit.
|
||||
The default AES encryption strength has been increased from 128-bit to 256-bit, improving the security of encrypted wikis.
|
||||
|
||||
* Download [[emtpy.html v5.3.8 from the archve|https://tiddlywiki.com/archive/empty/Empty-TiddlyWiki-5.3.8]] which uses AES 128 bit
|
||||
* Create some content
|
||||
* Save encrypted as eg: ''aes-128.html''
|
||||
* Create aes-256.html with TW v5.4.x
|
||||
* Create some content
|
||||
* Save encrypted as: ''aes-256.html''
|
||||
|
||||
''Import decryption test''
|
||||
|
||||
* Import ''aes-256.html'' into ''aes-128.html'' -> Decryption and import works
|
||||
* Import ''aes-128.html'' into ''aes-256.html'' -> Decryption and import works
|
||||
Existing wikis encrypted with the old 128-bit setting can still be decrypted and imported into wikis using 256-bit encryption, and vice versa, so there is no risk of losing access to previously-saved data.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
title: $:/changenotes/5.4.0/#8258
|
||||
description: Core plugin to serialize syntax trees back to strings
|
||||
description: Core support for serializing parsed wikitext syntax trees back to strings
|
||||
tags: $:/tags/ChangeNote
|
||||
release: 5.4.0
|
||||
change-type: feature
|
||||
@@ -7,8 +7,8 @@ change-category: developer
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/8258
|
||||
github-contributors: linonetwo
|
||||
|
||||
This is an internal change that will only be of direct interest to plugin developers but will form the basis of future user-facing features. For example:
|
||||
The core can now serialize parsed wikitext syntax trees back to wikitext strings. This is a developer-facing foundation that enables future tools such as:
|
||||
|
||||
* Programmatically manipulating wikitext content by modifying the syntax tree and deserializing it back to wikitext
|
||||
* Building WYSIWYG editors
|
||||
* Creating WikiText formatters and linters
|
||||
* Programmatic wikitext manipulation (parse, modify the AST, serialize back)
|
||||
* WYSIWYG editors
|
||||
* WikiText formatters and linters
|
||||
|
||||
@@ -7,10 +7,9 @@ change-category: hackability
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/8972 https://github.com/TiddlyWiki/TiddlyWiki5/pull/9614 https://github.com/TiddlyWiki/TiddlyWiki5/pull/9645
|
||||
github-contributors: Jermolene saqimtiaz
|
||||
|
||||
This PR introduces a new filter run prefix `:let` that assigns the result of the filter run to a variable that is made available for the remaining filter runs of the filter expression. It solves the problem that previously it was impossible to compute values for filter operator parameters; parameters could only be a literal string, text reference or variable reference.
|
||||
Two related capabilities have been added to TiddlyWiki's filter system:
|
||||
|
||||
This PR also introduces multi-valued variables, the ability to store a list of results in a variable, not just a single string. They can be assigned with the new `:let` filter run prefix, or the existing `<$let>` widget. The full list of values can be retrieved using round brackets instead of the usual angle brackets. In all other contexts only the first item in the list is used as the variable value.
|
||||
* ''`:let` filter run prefix'': Assigns the result of a filter run to a named variable, making it available to subsequent filter runs in the same expression. This solves a long-standing limitation where filter operator parameters could only be literal strings, text references, or variable references — not computed values
|
||||
* ''Multi-valued variables'': Variables can now hold a list of values, not just a single string. Assign them using `:let` or `<$let>`, and retrieve the full list using round brackets (e.g. `([myvar])`). In all other contexts, only the first value is used
|
||||
|
||||
* [[Multi-Valued Variables]]
|
||||
* [[Let Filter Run Prefix]]
|
||||
* [[LetWidget]]
|
||||
See [[Multi-Valued Variables]], [[Let Filter Run Prefix]], and [[LetWidget]] for details and examples.
|
||||
|
||||
@@ -8,4 +8,6 @@ modified: 20251115012705865
|
||||
release: 5.4.0
|
||||
tags: $:/tags/ChangeNote
|
||||
title: $:/changenotes/5.4.0/#9015
|
||||
type: text/vnd.tiddlywiki
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
Minor colour adjustments to the Muted palette.
|
||||
@@ -7,21 +7,11 @@ change-category: hackability
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9055
|
||||
github-contributors: Jermolene
|
||||
|
||||
This PR extends the handling of macro/procedure/function invocationsmade via the `<<..>>` shortcut syntax to allow dynamic parameters instead of just static strings. To indicate the new syntax the colon that usually separates a parameter name from its value is replaced by an equals sign. For example:
|
||||
Macro, procedure, and function calls via the `<<..>>` shortcut syntax now support dynamic parameter values, not just static strings. Use an equals sign instead of a colon to pass transclusions, filter expressions, or nested invocations as parameter values. For example:
|
||||
|
||||
```
|
||||
<<mymacro param={{Something}}>>
|
||||
<div class=<<mymacro param={{Something}}>>>
|
||||
<div class=<<mymacro param={{{ [<myvar>addprefix[https:] }}}>>>
|
||||
<div class=<<mymacro param={{{ [<innermacro p={{Something}}>addprefix[https:] }}}>>>
|
||||
```
|
||||
|
||||
Note that the new syntax obviates the need for `<$transclude $variable=...>` constructions in many cases.
|
||||
|
||||
The extended syntax allows parameter values to be passed as transclusions, filter expressions or nested invocations in three settings:
|
||||
|
||||
* As a standalone construction
|
||||
* As a widget attribute value
|
||||
* As a filter operand value
|
||||
|
||||
See [[Calls]] for more details and examples.
|
||||
This removes the need for `<$transclude $variable=...>` in many common cases. See [[Calls]] for full details and examples.
|
||||
|
||||
@@ -7,10 +7,4 @@ change-category: nodejs
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9078
|
||||
github-contributors: linonetwo
|
||||
|
||||
The web server's `get-file` route now supports HTTP Range requests and file streaming, enabling better loading and playback of large media files.
|
||||
|
||||
!! Features
|
||||
|
||||
* HTTP Range header: Enables partial content delivery with `206 Partial Content` responses, which is used when the user drags the progress bar in video/audio playback
|
||||
* Streaming file delivery: Browsers can now properly seek and stream video files from the `/files/` directory. Files are read using Node.js streams for better performance and memory efficiency.
|
||||
* Resumable downloads: To save interrupted downloads
|
||||
The web server's `get-file` route now supports HTTP Range requests and file streaming. This enables proper seeking and playback of video and audio files served from the `/files/` directory, and allows interrupted downloads to be resumed.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
change-category: developer
|
||||
change-type: enhancement
|
||||
created: 20260120153052332
|
||||
description: Adds a destroy method for widgets allowing for clean up of resources when a widget is removed.
|
||||
description: Add a destroy method to widgets for cleaning up resources when a widget is removed
|
||||
github-contributors: saqimtiaz
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9097
|
||||
modified: 20260125212701672
|
||||
@@ -10,4 +10,4 @@ tags: $:/tags/ChangeNote
|
||||
title: $:/changenotes/5.4.0/#9097
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
Adds a destroy method for widgets allowing for clean up of resources when a widget is removed.
|
||||
A `destroy()` method has been added to the widget base class, called when a widget is removed from the tree. Plugin developers can override this method to clean up event listeners, timers, or other resources when a widget is destroyed.
|
||||
@@ -7,12 +7,6 @@ change-category: developer
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9103
|
||||
github-contributors: Arlen22
|
||||
|
||||
This adds support for async functions to commands and startups.
|
||||
Commands and startup modules can now return a Promise (or be `async` functions). In both `synchronous: true` and `synchronous: false` modes, the resolved value is used as the return value.
|
||||
|
||||
In both `synchronous: true` and `synchronous: false` mode, if you return a promise (manually or by using the async keyword), it will wait for the promise to resolve, and then proceed using the resolved value as the return value of the function.
|
||||
|
||||
Importantly, in `synchronous: false` mode, returning a promise will not change the callback behavior. So you can safely use an async function and still call the callback to continue execution.
|
||||
|
||||
Previously, in `synchronous: true` mode, returning a promise would have just logged the promise to console and halted execution. Now the promise will be awaited, and if the value is truthy, it will be logged to console and halt execution. If the promise resolves to a falsy value, execution will continue. This is the main breaking change, but since logging an opaque promise to console is the most useless of all error messages, this is unlikely to seriously break anything in practice. Throwing anything, truthy or not, will still stop execution (in `synchronous: true` mode).
|
||||
|
||||
This also does not add any error handling code. Rejected promises should still be logged to console as unhandled rejections just as uncaught exceptions are currently.
|
||||
Note: In `synchronous: true` mode, a returned promise is now awaited rather than immediately logged to console. If it resolves to a truthy value, execution halts (unchanged behaviour); if it resolves to a falsy value, execution continues. Rejected promises are still reported as unhandled rejections.
|
||||
@@ -3,5 +3,5 @@ changenote: $:/changenotes/5.4.0/#9119
|
||||
created: 20251114082949025
|
||||
modified: 20251114082949025
|
||||
tags: $:/tags/ImpactNote
|
||||
description: Tiddlywiki no longer works on old browsers that doesn't support [[sticky flag|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky]].
|
||||
description: TiddlyWiki no longer works on old browsers that do not support the [[regular expression sticky flag|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky]].
|
||||
impact-type: compatibility-break
|
||||
|
||||
@@ -6,3 +6,5 @@ change-type: performance
|
||||
change-category: internal
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9119
|
||||
github-contributors: Leilei332
|
||||
|
||||
The wikitext parser now uses the regular expression sticky flag (`y`) instead of the global flag (`g`), improving search performance during parsing.
|
||||
|
||||
@@ -3,7 +3,7 @@ changenote: $:/changenotes/5.4.0/#9131
|
||||
created: 20250901000000000
|
||||
modified: 20250901000000000
|
||||
tags: $:/tags/ImpactNote
|
||||
description: CSS rules using `strike` selector will broken
|
||||
description: CSS rules targeting the `strike` element will no longer apply
|
||||
impact-type: compatibility-break
|
||||
|
||||
`strike` should be replaced by `s`.
|
||||
Any custom CSS rules that target the `strike` element should be updated to target `s` instead.
|
||||
|
||||
@@ -6,3 +6,5 @@ change-type: deprecation
|
||||
change-category: internal
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9131
|
||||
github-contributors: Leilei332
|
||||
|
||||
The strikethrough wikitext syntax now renders an `<s>` element instead of the obsolete `<strike>` element, aligning with the HTML5 standard.
|
||||
|
||||
@@ -7,4 +7,4 @@ change-category: developer
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9135
|
||||
github-contributors: Arlen22
|
||||
|
||||
Updates the eslint config to check for syntax newer than ES2017. This uses a plugin to check for newer syntax, for better error messages, and may need to be updated regularly along with eslint to catch the latest features.
|
||||
The ESLint configuration now checks for JavaScript syntax newer than ES2017, producing better error messages when unsupported language features are accidentally used in the codebase.
|
||||
@@ -7,4 +7,4 @@ change-category: theme
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9148
|
||||
github-contributors: Leilei332
|
||||
|
||||
Make some core classes display properly when Tiddlywiki's language uses bidirectional scripts.
|
||||
Core CSS classes have been updated to display correctly when TiddlyWiki is used with right-to-left or bidirectional scripts.
|
||||
@@ -6,3 +6,5 @@ change-type: enhancement
|
||||
change-category: widget
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9154
|
||||
github-contributors: Leilei332
|
||||
|
||||
The ButtonWidget now supports all `aria-*` attributes directly, improving accessibility for custom button implementations.
|
||||
|
||||
@@ -7,4 +7,4 @@ change-category: widget
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9167
|
||||
github-contributors: Leilei332
|
||||
|
||||
Allow LinkWidget to use all aria attributes directly.
|
||||
The LinkWidget now supports all `aria-*` attributes directly, improving accessibility for custom link implementations.
|
||||
@@ -7,6 +7,4 @@ change-category: hackability
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9177
|
||||
github-contributors: kookma
|
||||
|
||||
A new input parameter, `displayField`, has been added to the `list-links-draggable` and `list-tagged-draggable` macros,
|
||||
allowing users to specify which field (e.g., title, caption, or any custom field) should be displayed when a tiddler is
|
||||
rendered via the draggable macro.
|
||||
A new `displayField` parameter has been added to the `list-links-draggable` and `list-tagged-draggable` macros, allowing you to specify which field (for example, `title`, `caption`, or any custom field) is shown when a tiddler is rendered in the list.
|
||||
|
||||
@@ -3,7 +3,7 @@ changenote: $:/changenotes/5.4.0/#9183
|
||||
created: 20250901000000000
|
||||
modified: 20250901000000000
|
||||
tags: $:/tags/ImpactNote
|
||||
description: Server components of the core have been moved into a new `$:/core-server` plugin
|
||||
description: Server-only components of the core have been moved into a new $:/core-server plugin
|
||||
impact-type: pluginisation
|
||||
|
||||
It is not necessary for wikis to explicitly include the `$:/core-server` plugin.
|
||||
The `$:/core-server` plugin is included automatically when running the Node.js server — wikis do not need to include it explicitly.
|
||||
@@ -7,4 +7,4 @@ change-category: internal
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9183 https://github.com/TiddlyWiki/TiddlyWiki5/pull/9288
|
||||
github-contributors: Jermolene Leilei332
|
||||
|
||||
This change reduces the size of the core plugin by 119.3KB or about 4.5%.
|
||||
Server-only code has been moved from the core into a new `$:/core-server` plugin, reducing the core plugin size by approximately 119KB (about 4.5%). This benefits all browser-based wikis where the server code was previously loaded unnecessarily.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
change-category: nodejs
|
||||
change-type: feature
|
||||
created: 20260120154012282
|
||||
description: Allows server routes to be prioritized via ordering.
|
||||
description: Server routes can now declare a priority to control matching order
|
||||
github-contributors: saqimtiaz
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9206
|
||||
modified: 20260120160656948
|
||||
@@ -10,8 +10,4 @@ tags: $:/tags/ChangeNote
|
||||
title: $:/changenotes/5.4.0/#9206
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
This PR adds support for an info property to server route module exports. The info object may include a priority field, which determines the route’s order of precedence.
|
||||
|
||||
Priorities are numeric and follow a descending order: routes with higher priority values are processed first, similar to how saver modules are prioritized.
|
||||
|
||||
To maintain backward compatibility with existing code, any module that omits info or info.priority is assigned a default priority of 100. Core server routes have been updated to explicitly use this default value of 100.
|
||||
Server route modules can now export an `info.priority` field to control the order in which routes are matched. Higher numeric values take precedence (like saver modules). Modules that omit `info.priority` default to 100, maintaining backward compatibility.
|
||||
@@ -10,4 +10,4 @@ tags: $:/tags/ChangeNote
|
||||
title: $:/changenotes/5.4.0/#9214
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
''ControlPanel -> Info -> Basics'' tab now contains a ''Default focus field for existing tiddlers'' setting, which allows users to select, title, text or tags to be auto-focused if the editor is opened.
|
||||
A new ''Default focus field for existing tiddlers'' setting in ''Control Panel > Info > Basics'' lets you choose which field (title, text, or tags) receives focus when a tiddler's editor is opened.
|
||||
@@ -7,4 +7,4 @@ change-category: internal
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9235 https://github.com/TiddlyWiki/TiddlyWiki5/pull/9325
|
||||
github-contributors: Leilei332
|
||||
|
||||
Removes nested `<span class="tc-keyboard">` element in core search field.
|
||||
Removed an unnecessary nested `<span class="tc-keyboard">` element from the core search field, cleaning up the rendered HTML structure.
|
||||
|
||||
@@ -3,5 +3,5 @@ changenote: $:/changenotes/5.4.0/#9242
|
||||
created: 20250901000000000
|
||||
modified: 20250901000000000
|
||||
tags: $:/tags/ImpactNote
|
||||
description: Currently all the CSS property macros are deprecated
|
||||
description: CSS property macros with native CSS equivalents are now deprecated
|
||||
impact-type: deprecation
|
||||
|
||||
@@ -7,4 +7,4 @@ change-category: developer
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9242
|
||||
github-contributors: Leilei332
|
||||
|
||||
Mark CSS macros supported in 2017 baseline as deprecated. They are moved to [[$:/core/macros/deprecated]] now.
|
||||
CSS property macros that have native CSS equivalents in the 2017 baseline (such as `<<box-shadow>>` and `<<transform-origin>>`) have been deprecated and moved to [[$:/core/macros/deprecated]]. Use standard CSS properties in their place.
|
||||
@@ -6,3 +6,5 @@ change-type: enhancement
|
||||
change-category: theme
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9243 https://github.com/TiddlyWiki/TiddlyWiki5/pull/9625
|
||||
github-contributors: Leilei332
|
||||
|
||||
The Snow White theme has been updated to use standard CSS properties in place of the deprecated CSS property macros.
|
||||
|
||||
@@ -10,5 +10,4 @@ tags: $:/tags/ChangeNote
|
||||
title: $:/changenotes/5.4.0/#9254
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
* If macro `list-links-draggable` misses the tiddler parameter it points to `currentTiddler` variable by default now
|
||||
* Also discussed at [[Talk Tiddlywiki|https://talk.tiddlywiki.org/t/long-standing-bug-in-list-links-draggable-macro/8057]]
|
||||
The `list-links-draggable` macro now defaults to `currentTiddler` when no `tiddler` parameter is supplied, fixing a long-standing inconsistency with similar macros.
|
||||
@@ -1,7 +1,7 @@
|
||||
change-category: widget
|
||||
change-type: deprecation
|
||||
created: 20260120154533983
|
||||
description: The deprecated events and actions-* atrributes for the eventcatcher widget have been removed.
|
||||
description: Remove the deprecated events and actions-* attributes from the eventcatcher widget
|
||||
github-contributors: saqimtiaz
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9259
|
||||
modified: 20260120160236297
|
||||
@@ -10,4 +10,4 @@ tags: $:/tags/ChangeNote
|
||||
title: $:/changenotes/5.4.0/#9259
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
Deprecates and removes the `events` and `actions-*` attributes for the $eventcatcher widget.
|
||||
The previously-deprecated `events` and `actions-*` attributes of the `$eventcatcher` widget have been removed. Use the `on-*` attribute syntax instead.
|
||||
@@ -1,8 +1,10 @@
|
||||
changenote: $:/changenotes/5.4.0/#9259
|
||||
created: 20260120154817011
|
||||
description: Deprecated events and actons-* attributes from the eventcatcher widget
|
||||
description: The deprecated events and actions-* attributes have been removed from the eventcatcher widget
|
||||
impact-type: deprecation
|
||||
modified: 20260120154900978
|
||||
tags: $:/tags/ImpactNote
|
||||
title: $:/changenotes/5.4.0/#9259/impacts/deprecate-eventcatcher-attributes
|
||||
type: text/vnd.tiddlywiki
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
Any `$eventcatcher` widgets using the `events` or `actions-*` attributes must be updated to use the `on-*` attribute syntax.
|
||||
@@ -1,7 +1,7 @@
|
||||
change-category: hackability
|
||||
change-type: feature
|
||||
created: 20260120154445701
|
||||
description: Adds info tiddlers for viewport dimensions that are updated on window resize.
|
||||
description: New info tiddlers report viewport and window dimensions, updated on resize
|
||||
github-contributors: saqimtiaz
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9260
|
||||
modified: 20260120160515462
|
||||
@@ -10,9 +10,9 @@ tags: $:/tags/ChangeNote
|
||||
title: $:/changenotes/5.4.0/#9260
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
Adds info tiddlers for viewport dimensions that are updated on window resize.
|
||||
New `$:/info/browser/window/...` tiddlers report the current viewport and window dimensions, and are updated automatically when the window is resized. This makes it easy to build responsive layouts in wikitext without custom JavaScript.
|
||||
|
||||
!! Example: Main and a user-created window with windowID my-window
|
||||
!! Available info tiddlers (example: main window and a user-created window with windowID my-window)
|
||||
|
||||
|Window | Info tiddler | Meaning |h
|
||||
|system/main |`$:/info/browser/window/system/main/outer/width` | Full browser window including chrome, tabs, toolbars |
|
||||
|
||||
@@ -6,3 +6,5 @@ change-type: deprecation
|
||||
change-category: widget
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9275
|
||||
github-contributors: Leilei332
|
||||
|
||||
The Internet Explorer compatibility workaround in the RangeWidget has been removed as IE is no longer supported.
|
||||
|
||||
@@ -7,4 +7,4 @@ change-category: developer
|
||||
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9277
|
||||
github-contributors: kixam
|
||||
|
||||
Added an option to the TiddlyWiki5 server to enable CORS (ie. don't check `same-origin`). It is meant for advanced users, do not use it unless you understand the full consequences.
|
||||
The TiddlyWiki Node.js server now has an option to disable same-origin checking, allowing cross-origin requests. This is intended for advanced users who have a specific need for it and understand the security implications.
|
||||
|
||||