1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2026-07-09 05:12:44 +00:00

Compare commits

...

23 Commits

Author SHA1 Message Date
saqimtiaz 72deabc3c4 merge improvents from @hoelzro 2026-03-25 12:23:14 +01:00
saqimtiaz abf18a2f35 Merge remote-tracking branch 'origin/master' into blockquote-slowdown 2026-03-25 12:19:32 +01:00
Jeremy Ruston 2ea3663ea7 Merge branch 'tiddlywiki-com' 2026-03-24 17:14:24 +00:00
Jeremy Ruston 78b6f6f442 Docs: clarify parameters within calls in filters 2026-03-24 12:23:58 +00:00
Jeremy Ruston 3a4a8a206f Hotfix for broken test for dates
Fixes #9726
2026-03-24 11:19:17 +00:00
Mario Pietsch aff5be7195 fix flaky test runner (#9718) 2026-03-24 09:48:32 +01:00
Mario Pietsch c4991a54a0 Some minor changes to the filter docs (#9709)
* Some minor changes to the filter docs

* Fix wording in Intersection Filter Run Prefix documentation
2026-03-24 09:46:03 +01:00
Mario Pietsch 1d915389d9 Gitignore for automated tests (#9761)
* Add elements to gitignore, that are used for automated future test

* Add playwright configuration for Edge users that have no Chrome installed

* update tw-mcp setting
2026-03-22 08:42:13 +00:00
Mario Pietsch f5b4b1781e Fix edit toolbar button spaceing (#9763) 2026-03-22 08:31:38 +00:00
Mario Pietsch 65fcded29f Fix name clashes - definition tiddlers with images (#9759) 2026-03-20 07:54:03 +00:00
Urban Alič 962692c90c FIX: restore mhchem require for \ce and \pu macro support (#9756) 2026-03-19 22:34:56 +00:00
Mario Pietsch 533414b1df Change codewrapping option to pre-wrap
Fixes: #9757

Changed at: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9107/changes#diff-9c7b0f26dc347b90265ea42dd89565ecf1d7b85ac8b5ff3f7dc49eeec42003b5

Talk:  https://talk.tiddlywiki.org/t/5-4-0-prerelease-code-lines-pre-wrap-setting-as-default/15066
2026-03-19 19:47:26 +01:00
Himmel ec27a4bf20 Add new contributor Himmel to CLA (#9755) 2026-03-19 07:12:33 +00:00
Jeremy Ruston e1cf523e2c Merge branch 'tiddlywiki-com' 2026-03-17 13:20:55 +00:00
Keiran Harcombe 1ece822d7a Update kjharcombe.tid (#9750)
I've created my community card for tiddlywiki.com
2026-03-16 23:27:50 +00:00
Keiran Harcombe b7a3418823 Signing CLA (#9749) 2026-03-16 21:58:42 +00:00
Xavier Cazin bb6d88f144 fr-FR translation catchup before 5.4.0 (#9748)
* fr-FR translation for the Alerts aria string

* fr-FR translation for WikiInformation-related strings

* fr-FR updates for TiddlySpot/TiddlyHost-related strings

* fr-FR translation for Stability- and InfoTab-related strings
2026-03-16 17:08:06 +00:00
Jeremy Ruston 57c72756ef Fix releasenote avatars
Fixes #9746

Thanks @pmario
2026-03-16 16:57:55 +00:00
saqimtiaz fe3ac0b28a fix: whitespace 2026-02-26 09:45:09 +01:00
saqimtiaz d93dcbea6c fix: whitespace 2026-02-26 09:44:52 +01:00
saqimtiaz 66d12c257c fix: remove backwards incompatible change 2026-02-26 09:39:42 +01:00
saqimtiaz 321b5bafda fix: blockquotes trigger parsing as macros 2026-02-26 08:46:23 +01:00
saqimtiaz ba919fba7a fix: blockquotes trigger parsing as macros 2026-02-26 08:38:26 +01:00
43 changed files with 259 additions and 154 deletions
+10 -1
View File
@@ -3,10 +3,19 @@
.vs/
.vscode/
.claude/
# TiddlyWiki
tmp/
output/
node_modules/
$__StoryList.tid
# Playwright
/test-results/
/playwright-report/
/blob-report/
/playwright/.cache/
$__StoryList.tid
/playwright/.auth/
test-screenshots/
test-output.txt
.playwright-mcp
# TiddlyWiki MPC
.tw-mcp
+7
View File
@@ -47,6 +47,13 @@ $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.
*/
File diff suppressed because one or more lines are too long
+79 -63
View File
@@ -107,7 +107,7 @@ exports.parseStringLiteral = function(source,pos) {
type: "string",
start: pos
};
var reString = /(?:"""([\s\S]*?)"""|"([^"]*)")|(?:'([^']*)')|\[\[((?:[^\]]|\](?!\]))*)\]\]/g;
var reString = /(?:"""([\s\S]*?)"""|"([^"]*)")|(?:'([^']*)')|\[\[((?:[^\]]|\](?!\]))*)\]\]/y;
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>"'=:]+)/g;
var reVarName = /([^\s>"'=:]+)/y;
// Skip whitespace
pos = $tw.utils.skipWhiteSpace(source,pos);
// Look for a double opening angle bracket
@@ -237,9 +237,11 @@ 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 >>
if(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === ">" && source.charAt(pos + 1) === ">") ) {
return null;
// 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(!$tw.utils.parseWhiteSpace(source,pos) || source.indexOf(">>",pos) === -1) {
return null;
}
}
// Process attributes
pos = $tw.utils.parseMacroParametersAsAttributes(node,source,pos);
@@ -267,7 +269,7 @@ exports.parseMVVReferenceAsTransclusion = function(source,pos) {
orderedAttributes: []
};
// Define our regexps
var reVarName = /([^\s>"'=:)]+)/g;
var reVarName = /([^\s>"'=:)]+)/y;
// Skip whitespace
pos = $tw.utils.skipWhiteSpace(source,pos);
// Look for a double opening parenthesis
@@ -323,17 +325,17 @@ exports.parseMacroParameterAsAttribute = function(source,pos) {
start: pos
};
// Define our regexps
var reAttributeName = /([^\/\s>"'`=:]+)/g,
reUnquotedAttribute = /((?:(?:>(?!>))|[^\s>"'])+)/g,
reFilteredValue = /\{\{\{([\S\s]+?)\}\}\}/g,
reIndirectValue = /\{\{([^\}]+)\}\}/g,
reSubstitutedValue = /(?:```([\s\S]*?)```|`([^`]|[\S\s]*?)`)/g;
var reAttributeName = /([^\/\s>"'`=:]+)/y,
reUnquotedAttribute = /((?:(?:>(?!>))|[^\s>"'])+)/y,
reFilteredValue = /\{\{\{([\S\s]+?)\}\}\}/y,
reIndirectValue = /\{\{([^\}]+)\}\}/y,
reSubstitutedValue = /(?:```([\s\S]*?)```|`([^`]|[\S\s]*?)`)/y;
// 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,/=|:/g),
separatorToken = nameToken && $tw.utils.parseTokenRegExp(source,namePos,/=|:/y),
isNewStyleSeparator = false; // If there is no separator then we don't allow new style values
// If we have a name and a separator then we have a named attribute
if(nameToken && separatorToken) {
@@ -345,64 +347,78 @@ exports.parseMacroParameterAsAttribute = function(source,pos) {
}
// Skip whitespace
pos = $tw.utils.skipWhiteSpace(source,pos);
// 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 {
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 an indirect value
var indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);
if(indirectValue && isNewStyleSeparator) {
if(indirectValue) {
pos = indirectValue.end;
node.type = "indirect";
node.textReference = indirectValue.match[1];
} 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 {
}
}
}
}
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;
}
}
}
// 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,5 +1,7 @@
title: $:/core/ui/EditTemplate/body/toolbar/button
\whitespace trim
\define toolbar-button-icon()
<$list
@@ -28,7 +28,7 @@ describe("Backlinks tests", function() {
}
describe("a tiddler with no links to it", function() {
var wiki = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.wiki();
wiki.addTiddler({
title: "TestOutgoing",
@@ -186,7 +186,7 @@ describe("Backtranscludes and transclude filter tests", function() {
});
describe("include implicit self transclusion", function() {
var wiki = new $tw.Wiki();
var wiki = $tw.test.wiki();
wiki.addTiddler({
title: "TestOutgoing",
@@ -202,7 +202,7 @@ describe("Backtranscludes and transclude filter tests", function() {
});
describe("include explicit self transclusion", function() {
var wiki = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.wiki();
wiki.addTiddler({
title: "TestOutgoing",
@@ -534,7 +534,7 @@ describe("Checkbox widget", function() {
it("checkbox widget test: " + data.testName, function() {
// Setup
var wiki = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.wiki();
it("should compare numerical equality", function() {
expect(wiki.filterTiddlers("[[2]compare:number:eq[0003]]").join(",")).toBe("");
+1 -1
View File
@@ -583,7 +583,7 @@ describe("Filter tests", function() {
});
it("should handle the '[is[draft]]' operator", function() {
var wiki = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.wiki();
wiki.addTiddler({
title: "Brownies",
+1 -1
View File
@@ -82,7 +82,7 @@ describe("Utility tests", function() {
});
it("stringifyList shouldn't interfere with setting variables to negative numbers", function() {
var wiki = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.wiki();
var widget = createWidgetNode({type:"widget", text:"text"}, wiki);
function listener(e) {
+31 -31
View File
@@ -45,7 +45,7 @@ describe("Widget module", function() {
}
it("should deal with text nodes and HTML elements", function() {
var wiki = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.wiki();
// Construct the widget node
var text = "\n\n<$entity entity='&nbsp;' />\n\n<$entity entity='&#x2713;' />\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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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 = new $tw.Wiki();
var wiki = $tw.test.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"});
@@ -19,3 +19,5 @@ 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,6 +12,8 @@ type: text/vnd.tiddlywiki
"{" [: <-"indirect"-> /"anything but }"/] "}"
|
"<" [: <-"variable"-> /"anything but >"/] ">"
|
"(" [: <-"multi-valued variable"-> /"anything but )"/ ] ")" /"v5.4.0"/
)
"""/>
@@ -20,6 +22,7 @@ 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}`
@@ -28,6 +31,9 @@ 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[]]`.""">>
@@ -35,4 +41,8 @@ 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}`
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.""">>
@@ -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 keywoards which are known as [[filter operators|Filter Operators]].
The step's <<.def operator>> is drawn from a list of predefined keywords 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.
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`.
If a step's <<.def operator>> and <<.def suffix>> are //omitted// altogether, it defaults to the [[title|title Operator]] operator.
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>>.
<<.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.
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.
Filter operators can be extended by plugins.
@@ -43,3 +43,5 @@ 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,6 +15,15 @@ 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 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.
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.
[[Intersection Filter Run Prefix (Examples)]]
@@ -34,4 +34,14 @@ 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 `~`, 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.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 `=`, output titles are appended to the filter's output without de-duplication. <<.from-version "5.1.20">>
* the prefix `=`, <<.from-version "5.1.20">> output titles are appended to the filter's output without de-duplication.
* the prefix `=>`, the input is assigned to the variable named with the output title. <<.from-version "5.4.0">>
* 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.
{{Interchangeable Filter Run Prefixes}}
@@ -1,7 +1,7 @@
created: 20210618133745003
from-version: 5.3.0
modified: 20230710074225410
rp-input: <<.olink all>> tiddler titles
rp-input: <<.olink all>> tiddler titles (only evaluated when the output from previous runs is non-empty)
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,7 +1,7 @@
title: HelloThumbnail - Community Survey 2025
tags: HelloThumbnail
color: rgb(234, 205, 183)
image: Community Survey 2025
image: Community Survey 2025 Image
caption: Community Survey
link: Community Survey 2025
ribbon-text: NEW
@@ -1,7 +1,7 @@
background-color: #EDB431
caption: Intertwingled Innovations
color: #ff0
image: Intertwingled Innovations
image: Intertwingled Innovations Image
link: Intertwingled Innovations
tags: HelloThumbnail
title: HelloThumbnail - Intertwingled Innovations

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
title: Community Survey 2025 Image
type: image/webp

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

@@ -0,0 +1,3 @@
title: Intertwingled Innovations Image
type: image/webp
tags: picture
@@ -1,3 +0,0 @@
title: Intertwingled Innovations
type: image/webp
tags: picture
@@ -55,8 +55,10 @@ 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>
```
```
@@ -366,7 +366,7 @@ These are significant improvements that will benefit a broad range of users, and
<$list filter="[enlist<release-github-contributors>sort[]]" variable="username">
<li>
<a href={{{ [[https://github.com/]addsuffix<username>] }}} class="tc-tiddlylink-external" target="_blank" rel="noopener noreferrer">
<span class="doc-github-contributor-avatar"><img src={{{ [[https://github.com/]addsuffix<username>addsuffix[.png?size=64]] }}} width="64" height="64"/></span>
<span class="doc-github-contributor-avatar"><img src={{{ [[https://avatars.githubusercontent.com/]addsuffix<username>addsuffix[?size=64]] }}} width="64" height="64"/></span>
<span class="doc-github-contributor-username">@<$text text=<<username>>/></span>
</a>
</li>
+14 -6
View File
@@ -96,6 +96,10 @@ Plugins/PluginWillRequireReload: (rechargement requis)
Plugins/Plugins/Caption: Plugins
Plugins/Plugins/Hint: Plugins
Plugins/Reinstall/Caption: réinstalle
Plugins/Stability/Deprecated: DÉPRÉCIÉ
Plugins/Stability/Experimental: EXPÉRIMENTAL
Plugins/Stability/Legacy: LEGACY
Plugins/Stability/Stable: STABLE
Plugins/Themes/Caption: Thèmes
Plugins/Themes/Hint: Plugins de thème
Plugins/Update/Caption: mise à jour
@@ -128,17 +132,16 @@ Saving/GitService/Gitea/Password: //Jeton d'accès// pour cette API (via l'inter
Saving/TiddlySpot/Advanced/Heading: Paramètres avancés
Saving/TiddlySpot/BackupDir: Dossier des //sauvegardes//
Saving/TiddlySpot/Backups: Sauvegardes
Saving/TiddlySpot/Caption: Enregistreur ~TiddlySpot
Saving/TiddlySpot/ControlPanel: Panneau de contrôle ~TiddlySpot
Saving/TiddlySpot/Description: Ces paramètres ne servent que lors de la sauvegarde vers [[TiddlySpot|http://tiddlyspot.com]], [[TiddlyHost|https://tiddlyhost.com]] ou vers un serveur distant compatible. Voir [[ici|https://github.com/simonbaird/tiddlyhost/wiki/TiddlySpot-Saver-configuration-for-Tiddlyhost-and-Tiddlyspot]] pour plus d'informations sur la configuration de la sauvegarde sur ~TiddlySpot et ~TiddlyHost.
Saving/TiddlySpot/Caption: Enregistreur ~TiddlyHost
Saving/TiddlySpot/ControlPanel: Panneau de contrôle ~TiddlyHost
Saving/TiddlySpot/Description: Ces paramètres ne servent que lors de la sauvegarde vers [[TiddlyHost|https://tiddlyhost.com]] ou vers un serveur distant compatible. Voir [[ici|https://github.com/simonbaird/tiddlyhost/wiki/TiddlySpot-Saver-configuration-for-Tiddlyhost-and-Tiddlyspot]] pour plus d'informations sur la configuration de la sauvegarde sur ~TiddlyHost.
Saving/TiddlySpot/Filename: Nom du fichier enregistré
Saving/TiddlySpot/Heading: ~TiddlySpot
Saving/TiddlySpot/Heading: ~TiddlyHost
Saving/TiddlySpot/Hint: //L'URL par défaut est `http://<nom du wiki>.tiddlyspot.com/store.cgi`. Elle peut être remplacée par une adresse serveur personnalisée, comme `http://example.com/store.php`.//
Saving/TiddlySpot/Password: Mot de passe
Saving/TiddlySpot/ReadOnly: Notez que [[TiddlySpot|http://tiddlyspot.com]] n'autorise plus la création de nouveaux sites. Pour les nouveaux sites vous pouvez utiliser [[TiddlyHost|https://tiddlyhost.com]], un nouveau service d'hébergement qui remplace ~TiddlySpot.
Saving/TiddlySpot/ServerURL: URL du serveur
Saving/TiddlySpot/UploadDir: Dossier des dépôts
Saving/TiddlySpot/UserName: Nom utilisé pour ce Wiki
Saving/TiddlySpot/UserName: Nom du Wiki
Settings/AutoSave/Caption: Sauvegarde automatique
Settings/AutoSave/Disabled/Description: Pas de sauvegarde automatique des modifications
Settings/AutoSave/Enabled/Description: Sauvegarde automatique des modifications
@@ -184,6 +187,8 @@ Settings/DefaultSidebarTab/Caption: Onglet par défaut sur la barre latérale
Settings/DefaultSidebarTab/Hint: Indique l'onglet de la barre latérale qui sera affiché par défaut
Settings/DefaultMoreSidebarTab/Caption: Onglet par défaut sous le Plus de la barre latérale
Settings/DefaultMoreSidebarTab/Hint: Indique quel onglet sera affiché par défaut sous le Plus de la barre latérale
Settings/DefaultTiddlerInfoTab/Caption: Onglet par défaut pour les Infos du tiddler
Settings/DefaultTiddlerInfoTab/Hint: Spécifie l'onglet affiché par défaut lorsque le panneau d'information du tiddler est ouvert
Settings/LinkToBehaviour/Caption: Comportement à l'ouverture du tiddler
Settings/LinkToBehaviour/InsideRiver/Hint: Navigation depuis un emplacement //interne// au déroulé
Settings/LinkToBehaviour/OutsideRiver/Hint: Navigation depuis un emplacement //externe// au déroulé
@@ -245,3 +250,6 @@ ViewTemplateSubtitle/Caption: Visualisation du sous-titre
ViewTemplateSubtitle/Hint: Cette cascade de règles est utilisée par le template de visualisation par défaut pour choisir dynamiquement le template d'affichage du sous-titre d'un tiddler.
ViewTemplateTags/Caption: Visualisation des tags
ViewTemplateTags/Hint: Cette cascade de règles est utilisée par le template de visualisation par défaut pour choisir dynamiquement le template d'affichage de la zone de tags d'un tiddler.
WikiInformation/Caption: Informations sur le Wiki
WikiInformation/Hint: Cette page rassemble quelques informations générales sur la configuration de ce ~TiddlyWiki. Elle est conçue pour permettre de partager rapidement certains aspects de sa configuration avec d'autres, par exemple lorsqu'on demande de l'aide sur un forum. Elle ne contient aucune information privée ni personnelle, et rien n'est partagé sans être explicitement copié-collé ailleurs.
WikiInformation/Drag/Caption: Déplacer ce lien pour copier cet outil sur un autre wiki
+1
View File
@@ -1,5 +1,6 @@
title: $:/language/
Alerts: Alertes
AboveStory/ClassicPlugin/Warning: On dirait que vous essayez de charger un plugin conçu pour ~TiddlyWiki Classic. Merci de noter que [[ces plugins ne fonctionnent pas avec TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]. Plugins ~TiddlyWiki Classic détectés :
BinaryWarning/Prompt: Ce tiddler contient des données binaires
ClassicWarning/Hint: Ce tiddler est écrit au format TiddlyWiki Classic, qui n'est pas entièrement compatible avec TiddlyWiki version 5. Pour en savoir plus, rendez-vous à l'adresse https://tiddlywiki.com/static/Upgrading.html.
+4
View File
@@ -645,3 +645,7 @@ Rishu kumar, @rishu-7549, 2025/10/25
@peteratkins, 2025/12/29
@hsteve11, 2025/12/30
@kjharcombe, 2026/03/16
Himmel, @NotHimmel, 2026/03/19
+5
View File
@@ -40,6 +40,11 @@ module.exports = defineConfig({
{
name: 'firefox',
use: { ...devices['Desktop Firefox'] },
},
{
name: 'edge',
use: { ...devices['Desktop Chrome'], channel: 'msedge' },
}
],
});
@@ -143,6 +143,16 @@ exports.runTests = function(callback,specFilter) {
var env = jasmine.getEnv();
var jasmineInterface = jasmineCore.interface(jasmine,env);
context = $tw.utils.extend({},jasmineInterface,context);
// Initialise the WikiParser prototype with the correct rule config
// from the main wiki, before any test can trigger it from an empty wiki
$tw.wiki.parseText("text/vnd.tiddlywiki","");
// Set up test utilities available to all test specs
$tw.test = {
/** Create a test wiki instance, pre-configured with core settings */
wiki: function() {
return new $tw.Wiki();
}
};
// Iterate through all the test modules
var tests = $tw.wiki.filterTiddlers(TEST_TIDDLER_FILTER);
$tw.utils.each(tests,evalInContext);
@@ -19,7 +19,7 @@ describe("Wiki-based tests", function() {
var tiddler = $tw.wiki.getTiddler(title);
it(tiddler.fields.title + ": " + tiddler.fields.description, function() {
// Add our tiddlers
var wiki = new $tw.Wiki(),
var wiki = $tw.test.wiki(),
coreTiddler = $tw.wiki.getTiddler("$:/core");
if(coreTiddler) {
wiki.addTiddler(coreTiddler);
+1
View File
@@ -11,6 +11,7 @@ Wrapper for `katex.min.js` that provides a `<$latex>` widget. It is also availab
var katex = require("$:/plugins/tiddlywiki/katex/katex.min.js"),
Widget = require("$:/core/modules/widgets/widget.js").widget;
require("$:/plugins/tiddlywiki/katex/mhchem.min.js");
katex.macros = {};
katex.updateMacros = function() {
+1 -1
View File
@@ -2,4 +2,4 @@ title: $:/themes/tiddlywiki/vanilla/options/
stickytitles: no
sidebarlayout: fluid-fixed
codewrapping: pre
codewrapping: pre-wrap