1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2026-05-28 00:02:17 +00:00

Compare commits

..

64 Commits

Author SHA1 Message Date
Saq Imtiaz 8297f29a7b Revert "Use currentColor to style svg (#9316)"
This reverts commit dc7f2a57bb.
2026-04-10 12:22:55 +02:00
Saq Imtiaz 4699db9f89 Revert "Fix side effects of PR 9316 (#9568)" (#9798)
This reverts commit bf7c0b575c.
2026-04-10 12:22:41 +02:00
lin onetwo d977b0ac5c Fix #9788: only allow colon-separator named params with strict identifiers (#9791)
The reAttributeName regexp in parseMacroParameterAsAttribute was too
permissive, allowing single-character names like dollar sign followed by
colon. This caused values such as dollar-colon-slash-plugins-foo to be
mis-parsed as a named parameter dollar with value slash-plugins-foo.

Fix: when the separator is colon (legacy syntax), require the parameter
name to match [A-Za-z0-9-_]+ (same as the historic parseMacroParameter).
When the separator is equals (new-style dynamic parameters from #9055),
the wide character set is preserved so that names like double-dollar-one
continue to work.

Adds regression test Transclude/Procedures/Dollar/Param.
2026-04-10 11:06:07 +02:00
Saq Imtiaz 7298684951 Update package.json to resolve CI issues 2026-04-10 08:35:32 +02:00
Mario Pietsch f78d8252af Fix issue #9795 tree view regression (#9796) 2026-04-10 08:29:54 +02:00
Saq Imtiaz 54260b5be8 Updates Cerebrus action to v8.1 (#9793)
* Update pr-check-build-size.yml

* Update pr-comment-build-size.yml

* Update pr-validation.yml
2026-04-09 09:13:45 +02:00
superuser-does bcc30e305a Update Greek translation for 5.4.0 (#9782)
* Update Greek translation for 5.4.0

* Add Greek translation for Draft

* Correction to 'Saving'
2026-04-04 14:08:54 +01:00
Jeremy Ruston 34f4dfb903 Merge branch 'tiddlywiki-com' 2026-04-04 09:23:58 +01:00
superuser-does 32a3a3e478 [DOCS] Clean up Forums tiddler (#9780) 2026-04-04 08:49:55 +01:00
Bram Chen c6520c4429 Update chinese translations (#9781)
* Update languages/zh-Hans/ControlPanel.multids (commit 33b2f51)
* Update languages/zh-Hant/ControlPanel.multids (commit 33b2f51)
* Update languages/zh-Hans/Import.multids (commit b673651)
* Update languages/zh-Hant/Import.multids (commit b673651)
* Update languages/zh-Hans/TiddlerInfo.multids (commit 0177f09, cd8b1fa )
* Update languages/zh-Hant/TiddlerInfo.multids (commit 0177f09, cd8b1fa )
* Add languages/zh-Hant/Draft.multids (commit 9c09841)
2026-04-04 08:48:34 +01:00
Jeremy Ruston 83d242fb2c Merge branch 'tiddlywiki-com' 2026-04-03 11:10:58 +01:00
Jeremy Ruston ecafb7a4c0 A very minor tweak to the donation graphic
Spot the difference; the wonky text was offending me
2026-04-03 11:10:45 +01:00
Jeremy Ruston 0640e0abe2 Merge branch 'tiddlywiki-com' 2026-04-03 11:00:11 +01:00
Jeremy Ruston a71ac56cc9 More prominent donations link 2026-04-03 10:49:26 +01:00
Jeremy Ruston f518bdf27c Hire Jeremy banner now defaults to just being in the sidebar 2026-04-03 10:49:14 +01:00
Jeremy Ruston 0387b1100b Update CI dependencies 2026-04-01 17:13:32 +01:00
Jeremy Ruston c3a73fccd1 Fixed typo in v5.3.8 change note 2026-04-01 17:00:29 +01:00
Jeremy Ruston c25659d87c Restore compact call syntax (#9778)
* Initial commit

* Oops broken test
2026-04-01 15:22:42 +02:00
Saq Imtiaz 0c26a75472 Updates cerebrus action to v8 (#9779)
* Update pr-validation.yml

* Update pr-comment-build-size.yml

* Update pr-check-build-size.yml
2026-04-01 15:21:16 +02:00
Saq Imtiaz a24dc0e9e8 Update package.json to allow all current LTS versions of nodejs 2026-04-01 15:13:27 +02:00
Jeremy Ruston a499ed0906 Fix CI
Broken by 3cfb6b1202
2026-04-01 13:22:42 +01:00
Jeremy Ruston 3cfb6b1202 Update minimum Node version for as discussed for v5.4.0 2026-04-01 11:51:43 +01:00
Jeremy Ruston ac769e5dcd Commit package-lock.json
Benefit is that it pins dependencies and sub-dependencies, helping mitigate supply chain attacks
2026-04-01 11:42:17 +01:00
Jeremy Ruston ed01af8e47 Update release note with new release banner 2026-03-31 18:43:00 +01:00
Jeremy Ruston 92caa7312e Update new release banner
See https://talk.tiddlywiki.org/t/discussion-ai-and-vote-for-the-banner-for-5-4-0/15108/10
2026-03-31 18:25:20 +01:00
Mario Pietsch 478dce7009 fix problem with idDate() duplication in boot.js (#9771) 2026-03-31 18:50:31 +02:00
IchijikuIchigo f3c9cb2310 [ja_JP] Update Japanese translation (#9768)
* [ja_JP] Japanese translation update from commit: 5d0d2b1, e8fe6b9, 33b2f51

* [ja_JP] Japanese translation update from commit: 3543fe5

* [ja_JP] Japanese translation update from commit: 9c09841

* [ja_JP] Japanese translation update from commit: 390b755, 3e966d4, d17525e

* [ja_JP] Japanese translation update from commit: 4007610, 65afdac

* [ja_JP] Japanese translation update from commit: 5e8420a, 2adf091

* [ja_JP] Japanese translation update from commit: b673651

* [ja_JP] Japanese translation update from commit: a494361, 3af2a0a, 0e765bd

* [ja_JP] Japanese translation update from commit: daa24a5

* [ja_JP] Japanese translation update from commit: daa24a5, 881aed8

* [ja_JP] Japanese translation update from commit: 98e7255

* [ja_JP] Japanese translation update from commit: 4d9e683, cd8b1fa, 0177f09

* [ja_JP] Japanese translation update from commit: a494361

* [ja_JP] Japanese translation update from commit: eee3a0c, 169a381, f4fd5e7, 6332089, 1ce9973, c05c0d3, 9268a8c, e16635a

* [ja_JP] Delete duplicate Japanese translation files

* [ja_JP] Japanese translation update from commit: c02c3a0

* [ja_JP] Japanese translation update from commit: 147d758

* [ja_JP] Japanese translation update from commit: c6e4b7a, c4e2793, 12630d4

* [ja_JP] Japanese translation update from commit: 11b09be

* [ja_JP] Japanese translation update from commit: f7e50e0, e9557b5, 4ccdaf3, 6f93ce6

* [ja_JP] Japanese translation update from commit: f7e50e0, e9557b5, e87dadd, 814353d, 35a7a66, 5d91c27

* [ja_JP] Japanese translation update from commit: f7e50e0, e9557b5, 35a7a66

* [ja_JP] Japanese translation update from commit: d880cb1, 5176f00, 814353d, 35a7a66

* [ja_JP] Japanese translation update from commit: 5e8420a, 2adf091
2026-03-30 07:52:57 +02:00
Cameron Fischer 85fb634cae Moved bulkops relink behavior into dedicated module (#9703)
* Moved bulkops relink behavior into dedicated module

* Release notes

* Fixes for lint
2026-03-28 12:06:27 +00:00
Saq Imtiaz 280701fbde Fixes MVV's so that getVariableInfo returns undefined (#9765)
* wip: non-existent variables as attributes should be undefined

* wip: non-existent variables as attributes should be undefined

* tests: added missing test

* fix: restore mistakenly commited files

* fix: whitespace
2026-03-28 12:04:29 +00:00
Saq Imtiaz 01d3cde964 Fixes an issue where blockquotes trigger parsing as macros (#9695)
* fix: blockquotes trigger parsing as macros

* fix: blockquotes trigger parsing as macros

* fix: remove backwards incompatible change

* fix: whitespace

* fix: whitespace

* merge improvents from @hoelzro
2026-03-25 12:24: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
Jeremy Ruston dda4c7fb10 Update to latest version of dom-to-image-more library
Include it in tw5.com for testing
2026-03-15 16:53:51 +00:00
Jeremy Ruston fd3b96e2dd Merge branch 'tiddlywiki-com' 2026-03-15 10:46:16 +00:00
Jeremy Ruston c07396c453 Community: Add @kjharcombe as infrastructure team lead
Please add your community card when you can, many thanks.
2026-03-15 10:46:02 +00:00
Jeremy Ruston 7fc255f90c Merge branch 'tiddlywiki-com' 2026-03-14 18:18:09 +00:00
Jeremy Ruston 4cd84a6ba1 Geospatial plugin: remove residue of dom-to-image plugin
Fixes #9683
2026-03-11 17:30:23 +00:00
Jeremy Ruston fdfcd66c9b dom-to-image fix indentation 2026-03-11 17:14:47 +00:00
Andrew Gregory 3983086b96 Document alternating table row styling (#9713)
* Document alternating table row styling

Resolves issue #8738 (and explains why my old wiki row styles were swapped).

* Make note more prominent

Use note macro for note

Co-authored-by: Mario Pietsch <pmariojo@gmail.com>

---------

Co-authored-by: Mario Pietsch <pmariojo@gmail.com>
2026-03-11 14:22:49 +00:00
Jeremy Ruston a61331e6ed Fix readme for tw5.com-docs plugin
Fixes #9721
2026-03-11 13:50:37 +00:00
Jeremy Ruston 8773a0433c Dynaview: Fix RSOE with Update address bar while scrolling
See https://talk.tiddlywiki.org/t/your-help-is-needed-to-test-v5-4-0/14945/52
2026-03-11 12:22:14 +00:00
Mario Pietsch 846deb3039 Git Ignore Claude AI local settings (#9719) 2026-03-09 17:09:07 +00:00
Saq Imtiaz 111a168b0c feat: added community card for saqimtiaz (#9701) 2026-03-06 22:47:35 +00:00
Cameron Fischer 02b4c04a56 Release notes for PRs I've made, as requested (#9707)
* Release notes for PRs I've made, as requested

* Update #9297.tid

blog -> blob
2026-03-03 09:23:27 +01:00
Saq Imtiaz 9d5b5111d0 Revert "Add locale support for sort operator (#9400)" (#9702)
This reverts commit 98a61f01bb.
2026-03-01 08:02:18 +01:00
btheado 48cff401b2 Add tests/examples for transclusion shortcut syntax (#9705) 2026-03-01 07:58:59 +01:00
Saq Imtiaz 7a866b93e3 fix: alt support for images in markdown (#9700) 2026-02-27 18:53:58 +01:00
s793016 b0d99f3bd3 Fix Freelinks Aho-Corasick: failure links, cache invalidation, longest-match, and Unicode safety (#9676)
* Update aho-corasick.js

 fix transition logic; ensure complete outputs (via failure-output merge); clean up stats/build scoping; clarify CJK boundary behavior.

* Update text.js

implement global longest-match priority with overlap suppression; fix refresh invalidation to ignore $:/state and drafts; handle deletions precisely to avoid rebuilding on draft deletion; add defensive check for cached automaton presence.

* Update text.js

remove comment

* Update aho-corasick.js

remove comment

* Create #9672.tid

* Create #2026-0222.tid

* Delete editions/tw5.com/tiddlers/releasenotes/5.4.0/#2026-0222.tid

* Update text.js

remove \"

* Update and rename #9672.tid to #9676.tid

change to right number

* Update #9397.tid

update the existing release note with the new PR link instead of creating a new release note.

* Delete editions/tw5.com/tiddlers/releasenotes/5.4.0/#9676.tid

update the existing release note with the new PR link instead of creating a new release note.

* Rename #9397.tid to #9676.tid

update the existing release note with the new PR link instead of creating a new release note.

* Update and rename #9676.tid to #9397.tid

add link

* Rename #9397.tid to #9676.tid

* Update tiddlywiki.info

add plugin for test build

* Update tiddlywiki.info

reverse change, ready to be merge.
2026-02-25 12:07:32 +01:00
Andrew Gregory 91e7a62c13 docs: Tabs examples dynamically setting default tab (#9693)
Where tabs have been selected using a filter it is sometimes useful to set the default tab dynamically from the filter results. In most of these cases it is also desirable that the state not be persistent.
2026-02-25 08:14:38 +01:00
Jeremy Ruston a3acbaa2f1 Update road map 2026-02-20 09:30:25 +00:00
188 changed files with 2499 additions and 1337 deletions
+8 -8
View File
@@ -5,17 +5,17 @@ on:
- master
- tiddlywiki-com
env:
NODE_VERSION: "22"
NODE_VERSION: "22.22"
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v4
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: "${{ env.NODE_VERSION }}"
- run: "./bin/ci-test.sh"
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v7
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@v5
- uses: actions/setup-node@v4
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
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@v5
- uses: actions/setup-node@v4
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: "${{ env.NODE_VERSION }}"
- run: "./bin/ci-pre-build.sh"
+2 -2
View File
@@ -20,7 +20,7 @@ jobs:
steps:
- name: build-size-check
id: get_sizes
uses: TiddlyWiki/cerebrus@v7
uses: TiddlyWiki/cerebrus@v8.1
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 }}'
}
});
});
+1 -1
View File
@@ -25,7 +25,7 @@ jobs:
steps:
- name: Build and check size
uses: TiddlyWiki/cerebrus@v7
uses: TiddlyWiki/cerebrus@v8.1
with:
pr_number: ${{ inputs.pr_number }}
repo: ${{ github.repository }}
+2 -2
View File
@@ -15,7 +15,7 @@ jobs:
steps:
# Step 1: Validate PR paths
- name: Validate PR Paths
uses: TiddlyWiki/cerebrus@v6
uses: TiddlyWiki/cerebrus@v8.1
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@v7
uses: TiddlyWiki/cerebrus@v8
with:
pr_number: ${{ github.event.pull_request.number }}
repo: ${{ github.repository }}
+11 -1
View File
@@ -2,10 +2,20 @@
.c9/
.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 -3
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.
*/
@@ -124,9 +131,6 @@ $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) {
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,6 +1,7 @@
created: 20250909171928024
modified: 20251110133437795
tags: Community/Team
leader: @kjharcombe
team: @MotovunJack
title: Infrastructure Team
@@ -12,4 +13,4 @@ The infrastructure includes:
* github.com/TiddlyWiki
* tiddlywiki.com DNS
* Netlify account for PR previews
* edit.tiddlywiki.com
* edit.tiddlywiki.com
+5 -5
View File
@@ -14,31 +14,31 @@ Export our filter function
*/
exports.sort = function(source,operator,options) {
var results = prepare_results(source);
options.wiki.sortTiddlers(results,operator.operands[0] || "title",operator.prefix === "!",false,false,undefined,operator.operands[1]);
options.wiki.sortTiddlers(results,operator.operand || "title",operator.prefix === "!",false,false);
return results;
};
exports.nsort = function(source,operator,options) {
var results = prepare_results(source);
options.wiki.sortTiddlers(results,operator.operands[0] || "title",operator.prefix === "!",false,true,undefined,operator.operands[1]);
options.wiki.sortTiddlers(results,operator.operand || "title",operator.prefix === "!",false,true);
return results;
};
exports.sortan = function(source, operator, options) {
var results = prepare_results(source);
options.wiki.sortTiddlers(results, operator.operands[0] || "title", operator.prefix === "!",false,false,true,operator.operands[1]);
options.wiki.sortTiddlers(results, operator.operand || "title", operator.prefix === "!",false,false,true);
return results;
};
exports.sortcs = function(source,operator,options) {
var results = prepare_results(source);
options.wiki.sortTiddlers(results,operator.operands[0] || "title",operator.prefix === "!",true,false,undefined,operator.operands[1]);
options.wiki.sortTiddlers(results,operator.operand || "title",operator.prefix === "!",true,false);
return results;
};
exports.nsortcs = function(source,operator,options) {
var results = prepare_results(source);
options.wiki.sortTiddlers(results,operator.operands[0] || "title",operator.prefix === "!",true,true,undefined,operator.operands[1]);
options.wiki.sortTiddlers(results,operator.operand || "title",operator.prefix === "!",true,true);
return results;
};
-34
View File
@@ -1,34 +0,0 @@
/*\
title: $:/core/modules/filters/wikify.js
type: application/javascript
module-type: filteroperator
Filter operator wikifying each string in the input list and returning the result as a list of strings
\*/
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter function
*/
exports.wikify = function(source,operator,options) {
var output = operator.operands[0],
mode = operator.operands[1],
type = operator.operands[2],
results = [];
source(function(tiddler,title) {
var wikifier = new $tw.utils.Wikifier({
wiki: options.wiki,
widget: options.widget,
text: title,
type: type,
mode: mode,
output: output
});
results.push(wikifier.getResult());
});
return results;
};
+85 -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(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,18 +325,24 @@ 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,
reStrictIdentifier = /^[A-Za-z0-9\-_]+$/,
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
// 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];
@@ -345,64 +353,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;
+54
View File
@@ -0,0 +1,54 @@
/*\
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);
}
}
});
};
-105
View File
@@ -1,105 +0,0 @@
/*\
title: $:/core/modules/utils/wikifier.js
type: application/javascript
module-type: utils
A high level helper class for parsing and wikification
\*/
/*
Options include:
wiki: wiki to be used for wikification
widget: optional widget to be used as parent of wikified text
text: text to be parsed/wikified
type: type of the text
mode: inline or block
output: text, formattedtext, html, parsetree or widgettree
*/
function Wikifier(options) {
this.wiki = options.wiki || $tw.wiki;
this.widget = options.widget || $tw.rootWidget;
this.text = options.text || "";
this.type = options.type || "";
this.mode = options.mode || "block";
this.output = options.output || "text";
// Create the parse tree
this.parser = this.wiki.parseText(this.type,this.text,{
parseAsInline: this.mode === "inline"
});
// Create the widget tree
this.widgetNode = this.wiki.makeWidget(this.parser,{
document: $tw.fakeDocument,
parentWidget: this.widget
});
// Render the widget tree to the container
this.container = $tw.fakeDocument.createElement("div");
this.widgetNode.render(this.container,null);
};
Wikifier.prototype.refresh = function(changedTiddlers) {
// Refresh the widget tree
return this.widgetNode.refresh(changedTiddlers);
};
/*
Return the result string
*/
Wikifier.prototype.getResult = function() {
var result;
switch(this.output) {
case "text":
result = this.container.textContent;
break;
case "formattedtext":
result = this.container.formattedTextContent;
break;
case "html":
result = this.container.innerHTML;
break;
case "parsetree":
result = JSON.stringify(this.parser.tree,0,$tw.config.preferences.jsonSpaces);
break;
case "widgettree":
result = JSON.stringify(this.getWidgetTree(),0,$tw.config.preferences.jsonSpaces);
break;
}
return result;
};
/*
Return a string of the widget tree
*/
Wikifier.prototype.getWidgetTree = function() {
var copyNode = function(widgetNode,resultNode) {
var type = widgetNode.parseTreeNode.type;
resultNode.type = type;
switch(type) {
case "element":
resultNode.tag = widgetNode.parseTreeNode.tag;
break;
case "text":
resultNode.text = widgetNode.parseTreeNode.text;
break;
}
if(Object.keys(widgetNode.attributes || {}).length > 0) {
resultNode.attributes = {};
$tw.utils.each(widgetNode.attributes,function(attr,attrName) {
resultNode.attributes[attrName] = widgetNode.getAttribute(attrName);
});
}
if(Object.keys(widgetNode.children || {}).length > 0) {
resultNode.children = [];
$tw.utils.each(widgetNode.children,function(widgetChildNode) {
var node = {};
resultNode.children.push(node);
copyNode(widgetChildNode,node);
});
}
},
results = {};
copyNode(this.widgetNode,results);
return results;
};
exports.Wikifier = Wikifier;
+2 -2
View File
@@ -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.length <= 1) {
if(resultList && 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.resultList.length > 1 ? variableInfo.resultList : variableInfo.text;
allVars[v] = variableInfo && variableInfo.resultList && variableInfo.resultList.length > 1 ? variableInfo.resultList : variableInfo.text;
}
}
if(this.filter) {
+2 -2
View File
@@ -189,7 +189,7 @@ Widget.prototype.getVariableInfo = function(name,options) {
}
return {
text: text,
resultList: [text]
resultList: text === undefined ? text : [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] };
: { text: value, resultList: value === undefined ? value : [value] };
}
opts = opts || {};
opts.variables = Object.assign({}, vars, opts.variables || {});
+78 -11
View File
@@ -36,22 +36,89 @@ Compute the internal state of the widget
WikifyWidget.prototype.execute = function() {
// Get our parameters
this.wikifyName = this.getAttribute("name");
// Create the wikifier
this.wikifier = new $tw.utils.Wikifier({
wiki: this.wiki,
widget: this,
text: this.getAttribute("text"),
type: this.getAttribute("type"),
mode: this.getAttribute("mode","block"),
output: this.getAttribute("output","text")
this.wikifyText = this.getAttribute("text");
this.wikifyType = this.getAttribute("type");
this.wikifyMode = this.getAttribute("mode","block");
this.wikifyOutput = this.getAttribute("output","text");
// Create the parse tree
this.wikifyParser = this.wiki.parseText(this.wikifyType,this.wikifyText,{
parseAsInline: this.wikifyMode === "inline"
});
this.wikifyResult = this.wikifier.getResult();
// Create the widget tree
this.wikifyWidgetNode = this.wiki.makeWidget(this.wikifyParser,{
document: $tw.fakeDocument,
parentWidget: this
});
// Render the widget tree to the container
this.wikifyContainer = $tw.fakeDocument.createElement("div");
this.wikifyWidgetNode.render(this.wikifyContainer,null);
this.wikifyResult = this.getResult();
// Set context variable
this.setVariable(this.wikifyName,this.wikifyResult);
// Construct the child widgets
this.makeChildWidgets();
};
/*
Return the result string
*/
WikifyWidget.prototype.getResult = function() {
var result;
switch(this.wikifyOutput) {
case "text":
result = this.wikifyContainer.textContent;
break;
case "formattedtext":
result = this.wikifyContainer.formattedTextContent;
break;
case "html":
result = this.wikifyContainer.innerHTML;
break;
case "parsetree":
result = JSON.stringify(this.wikifyParser.tree,0,$tw.config.preferences.jsonSpaces);
break;
case "widgettree":
result = JSON.stringify(this.getWidgetTree(),0,$tw.config.preferences.jsonSpaces);
break;
}
return result;
};
/*
Return a string of the widget tree
*/
WikifyWidget.prototype.getWidgetTree = function() {
var copyNode = function(widgetNode,resultNode) {
var type = widgetNode.parseTreeNode.type;
resultNode.type = type;
switch(type) {
case "element":
resultNode.tag = widgetNode.parseTreeNode.tag;
break;
case "text":
resultNode.text = widgetNode.parseTreeNode.text;
break;
}
if(Object.keys(widgetNode.attributes || {}).length > 0) {
resultNode.attributes = {};
$tw.utils.each(widgetNode.attributes,function(attr,attrName) {
resultNode.attributes[attrName] = widgetNode.getAttribute(attrName);
});
}
if(Object.keys(widgetNode.children || {}).length > 0) {
resultNode.children = [];
$tw.utils.each(widgetNode.children,function(widgetChildNode) {
var node = {};
resultNode.children.push(node);
copyNode(widgetChildNode,node);
});
}
},
results = {};
copyNode(this.wikifyWidgetNode,results);
return results;
};
/*
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
*/
@@ -63,9 +130,9 @@ WikifyWidget.prototype.refresh = function(changedTiddlers) {
return true;
} else {
// Refresh the widget tree
if(this.wikifier.refresh(changedTiddlers)) {
if(this.wikifyWidgetNode.refresh(changedTiddlers)) {
// Check if there was any change
var result = this.wikifier.getResult();
var result = this.getResult();
if(result !== this.wikifyResult) {
// If so, save the change
this.wikifyResult = result;
+4 -40
View File
@@ -9,6 +9,7 @@ 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.
*/
@@ -32,50 +33,13 @@ 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) {
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);
}
}
});
for(var name in relinkers) {
relinkers[name].relink(this,fromTitle,toTitle,options);
}
}
};
+37 -10
View File
@@ -369,16 +369,31 @@ Sort an array of tiddler titles by a specified field
isDescending: true if the sort should be descending
isCaseSensitive: true if the sort should consider upper and lower case letters to be different
*/
exports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric,locale) {
exports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric) {
var self = this;
if(sortField === "title") {
if(!isNumeric && !isAlphaNumeric) {
const sorter = new Intl.Collator(locale, { sensitivity: isCaseSensitive ? "variant" : "accent" });
if(isDescending) {
titles.sort((a,b) => sorter.compare(b, a));
if(isCaseSensitive) {
if(isDescending) {
titles.sort(function(a,b) {
return b.localeCompare(a);
});
} else {
titles.sort(function(a,b) {
return a.localeCompare(b);
});
}
} else {
titles.sort((a,b) => sorter.compare(a, b));
}
if(isDescending) {
titles.sort(function(a,b) {
return b.toLowerCase().localeCompare(a.toLowerCase());
});
} else {
titles.sort(function(a,b) {
return a.toLowerCase().localeCompare(b.toLowerCase());
});
}
}
} else {
titles.sort(function(a,b) {
var x,y;
@@ -399,8 +414,14 @@ exports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,is
}
}
}
const sorter = new Intl.Collator(locale, { numeric: isAlphaNumeric, sensitivity: isAlphaNumeric ? "base" : isCaseSensitive ? "variant" : "accent" });
return isDescending ? sorter.compare(b, a) : sorter.compare(a, b);
if(isAlphaNumeric) {
return isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: "base"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: "base"});
}
if(!isCaseSensitive) {
a = a.toLowerCase();
b = b.toLowerCase();
}
return isDescending ? b.localeCompare(a) : a.localeCompare(b);
});
}
} else {
@@ -442,8 +463,14 @@ exports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,is
}
a = String(a);
b = String(b);
const sorter = new Intl.Collator(locale, { numeric: isAlphaNumeric, sensitivity: isAlphaNumeric ? "base" : isCaseSensitive ? "variant" : "accent" });
return isDescending ? sorter.compare(b, a) : sorter.compare(a, b);
if(isAlphaNumeric) {
return isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: "base"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: "base"});
}
if(!isCaseSensitive) {
a = a.toLowerCase();
b = b.toLowerCase();
}
return isDescending ? b.localeCompare(a) : a.localeCompare(b);
});
}
};
@@ -1,5 +1,7 @@
title: $:/core/ui/EditTemplate/body/toolbar/button
\whitespace trim
\define toolbar-button-icon()
<$list
+4 -2
View File
@@ -17,11 +17,13 @@ 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)$; background-color:$(backgroundColor)$; --tp-remove-tag-button-color:$(foregroundColor)$`
style=`color:$(foregroundColor)$; fill:$(foregroundColor)$; background-color:$(backgroundColor)$;`
>
<$transclude tiddler=<<icon>>/>
<$view field="title" format="text"/>
<$button class="tc-btn-invisible tc-remove-tag-button">
<$button class="tc-btn-invisible tc-remove-tag-button"
style.fill=<<foregroundColor>>
>
<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter="-[{!!title}]"/>
{{$:/core/images/close-button}}
</$button>
+1 -1
View File
@@ -2,7 +2,7 @@ title: $:/core/ui/ViewTemplate/title
tags: $:/tags/ViewTemplate
\whitespace trim
\define title-styles() color:$(foregroundColor)$;
\define title-styles() fill:$(foregroundColor)$;
<div class="tc-tiddler-title tc-clearfix">
<div class="tc-titlebar">
+1
View File
@@ -3,6 +3,7 @@ tags: $:/tags/Macro
\define tag-pill-styles()
background-color:$(backgroundColor)$;
fill:$(foregroundColor)$;
color:$(foregroundColor)$;
\end
+1 -1
View File
@@ -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="color:$color$;"
style="fill:$color$;color:$color$;"
>$icon$</div><div class="tc-thumbnail-caption">$caption$</div></div></$link>
\end
@@ -19,6 +19,7 @@ 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,7 +2,6 @@ created: 20131127215321439
modified: 20140912135951542
title: $:/DefaultTiddlers
[[Hire the founder of TiddlyWiki]]
[[TiddlyWiki Pre-release]]
HelloThere
[[Quick Start]]
+2 -1
View File
@@ -13,7 +13,8 @@
"tiddlywiki/menubar",
"tiddlywiki/jszip",
"tiddlywiki/confetti",
"tiddlywiki/tour"
"tiddlywiki/tour",
"tiddlywiki/dom-to-image"
],
"themes": [
"tiddlywiki/vanilla",
@@ -1,21 +0,0 @@
title: Operators/Wikify/TextMode
description: Simple wikify operator
type: text/vnd.tiddlywiki-multiple
tags: [[$:/tags/wiki-test-spec]]
title: Output
\parsermode inline
<$text text={{{ [subfilter{Filter}] }}}/>
+
title: Filter
[{Text}wikify[html],[inline],[text/vnd.tiddlywiki]]
+
title: Text
This is ''the text'' that is __wikified__
+
title: ExpectedResult
This is &lt;strong&gt;the text&lt;/strong&gt; that is &lt;u&gt;wikified&lt;/u&gt;
@@ -1,64 +0,0 @@
title: Operators/Wikify/ParseTreeMode
description: Simple wikify operator
type: text/vnd.tiddlywiki-multiple
tags: [[$:/tags/wiki-test-spec]]
title: Output
\parsermode inline
<$text text={{{ [subfilter{Filter}] }}}/>
+
title: Filter
[{Text}wikify[parsetree],[inline],[text/vnd.tiddlywiki]]
+
title: Text
This is ''the text'' that is __wikified__
+
title: ExpectedResult
[
{
"type": "text",
"text": "This is ",
"start": 0,
"end": 8
},
{
"type": "element",
"tag": "strong",
"children": [
{
"type": "text",
"text": "the text",
"start": 10,
"end": 18
}
],
"start": 8,
"end": 20,
"rule": "bold"
},
{
"type": "text",
"text": " that is ",
"start": 20,
"end": 29
},
{
"type": "element",
"tag": "u",
"children": [
{
"type": "text",
"text": "wikified",
"start": 31,
"end": 39
}
],
"start": 29,
"end": 41,
"rule": "underscore"
}
]
@@ -1,21 +0,0 @@
title: Operators/Wikify/TextMode
description: Simple wikify operator
type: text/vnd.tiddlywiki-multiple
tags: [[$:/tags/wiki-test-spec]]
title: Output
\parsermode inline
<$text text={{{ [subfilter{Filter}] }}}/>
+
title: Filter
[{Text}wikify[text],[inline],[text/vnd.tiddlywiki]]
+
title: Text
This is ''the text'' that is __wikified__
+
title: ExpectedResult
This is the text that is wikified
@@ -0,0 +1,28 @@
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>
@@ -0,0 +1,13 @@
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>
@@ -0,0 +1,22 @@
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>12</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 = 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"});
@@ -1,6 +0,0 @@
created: 20251001034405510
list: A a Ä ä Z z O o Õ õ Ö ö Ü ü Y y
modified: 20251218023544134
tags:
title: Locale Example
type: text/vnd.tiddlywiki
@@ -0,0 +1,16 @@
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.
+9 -15
View File
@@ -4,29 +4,23 @@ tags: Community
title: Forums
type: text/vnd.tiddlywiki
!!! Users
! User forums
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.
!! 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.
https://talk.tiddlywiki.org/
Other Forums:
!! Google Groups
!!! 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|https://www.reddit.com/r/TiddlyWiki5/]]
* Chat on Discord at https://discord.gg/HFFZVQ8
!! Developers
{{Developers}}
* TiddlyWiki Subreddit: [[/r/TiddlyWiki5|https://www.reddit.com/r/TiddlyWiki5/]]
* Chat on Discord at https://discord.gg/HFFZVQ8
@@ -1,5 +1,5 @@
created: 20150124112340000
modified: 20251218023608468
modified: 20150124113250000
tags: [[sort Operator]] [[Operator Examples]]
title: sort Operator (Examples)
type: text/vnd.tiddlywiki
@@ -11,10 +11,3 @@ type: text/vnd.tiddlywiki
<<.operator-example 3 "one two Three four +[sort[]]">>
<<.operator-example 4 "[prefix[Tiddl]sort[text]]">>
<<.operator-example 5 "[has[created]sort[created]limit[10]]" "the oldest 10 tiddlers in the wiki">>
! Using a custom locale
The following examples shows the differences when using the sort operator with default, Swedish and Estonian locale.
<<.operator-example 6 "[list[Locale Example]sort[]]">>
<<.operator-example 7 "[list[Locale Example]sort[],[sv]]">>
<<.operator-example 8 "[list[Locale Example]sort[],[et]]">>
+8 -8
View File
@@ -1,15 +1,15 @@
caption: nsort
created: 20140410103123179
modified: 20251227084602319
op-input: a [[selection of titles|Title Selection]]
op-neg-output: the input, likewise sorted into descending order
op-output: the input, sorted into ascending order by field <<.field F>>, treating field values as numbers
op-parameter: accept same parameters as the [[sort Operator]]
op-parameter-name: F
op-purpose: sort the input by number field
modified: 20150203190051000
tags: [[Filter Operators]] [[Field Operators]] [[Order Operators]] [[Negatable Operators]]
title: nsort Operator
type: text/vnd.tiddlywiki
caption: nsort
op-purpose: sort the input by number field
op-input: a [[selection of titles|Title Selection]]
op-parameter: the name of a [[field|TiddlerFields]], defaulting to <<.field title>>
op-parameter-name: F
op-output: the input, sorted into ascending order by field <<.field F>>, treating field values as numbers
op-neg-output: the input, likewise sorted into descending order
Non-numeric values are treated as having a higher value than any number, and the difference between capital and lowercase letters is ignored. Compare <<.olink nsortcs>>.
@@ -1,10 +1,10 @@
caption: nsortcs
created: 20140410103123179
modified: 20251227084615705
modified: 20150417125717078
op-input: a [[selection of titles|Title Selection]]
op-neg-output: the input, likewise sorted into descending order
op-output: the input, sorted into ascending order by field <<.place F>>, treating field values as numbers
op-parameter: accept same parameters as the [[sort Operator]]
op-parameter: the name of a [[field|TiddlerFields]], defaulting to <<.field title>>
op-parameter-name: F
op-purpose: sort the input titles by number field, treating upper and lower case as different
tags: [[Filter Operators]] [[Field Operators]] [[Order Operators]] [[Negatable Operators]]
+8 -14
View File
@@ -1,22 +1,16 @@
caption: sort
created: 20140410103123179
modified: 20251227084644651
op-input: a [[selection of titles|Title Selection]]
op-neg-output: the input, likewise sorted into descending order
op-output: the input, sorted into ascending order by field <<.field F>>, treating field values as text
op-parameter: the <<.op sort>> operator accepts 1 or 2 parameters, see below for details
op-parameter-name: F
op-purpose: sort the input by text field
modified: 20150203191228000
tags: [[Filter Operators]] [[Common Operators]] [[Field Operators]] [[Order Operators]] [[Negatable Operators]]
title: sort Operator
type: text/vnd.tiddlywiki
caption: sort
op-purpose: sort the input by text field
op-input: a [[selection of titles|Title Selection]]
op-parameter: the name of a [[field|TiddlerFields]], defaulting to <<.field title>>
op-parameter-name: F
op-output: the input, sorted into ascending order by field <<.field F>>, treating field values as text
op-neg-output: the input, likewise sorted into descending order
The difference between capital and lowercase letters is ignored. Compare <<.olink sortcs>>.
```
[sort[<field>],[<locale>]]
```
* ''field'' : the name of a [[field|TiddlerFields]], defaulting to <<.field title>>
* ''locale'': (optional). A string with a [[BCP 47 language tag|https://developer.mozilla.org/en-US/docs/Glossary/BCP_47_language_tag]]
<<.operator-examples "sort">>
+2 -2
View File
@@ -1,10 +1,10 @@
caption: sortan
created: 20180222071605739
modified: 20251227084439804
modified: 20180223012553446
op-input: a [[selection of titles|Title Selection]]
op-neg-output: the input, likewise sorted into descending order
op-output: the input, sorted into ascending order by field <<.field F>>, treating field values as alphanumerics
op-parameter: accept same parameters as the [[sort Operator]]
op-parameter: the name of a [[field|TiddlerFields]], defaulting to <<.field title>>
op-parameter-name: F
op-purpose: sort the input by text field considering them as alphanumerics
tags: [[Filter Operators]] [[Common Operators]] [[Field Operators]] [[Order Operators]] [[Negatable Operators]]
+2 -2
View File
@@ -1,10 +1,10 @@
caption: sortcs
created: 20140410103123179
modified: 20251227084416522
modified: 20150417125704503
op-input: a [[selection of titles|Title Selection]]
op-neg-output: the input, likewise sorted into descending order
op-output: the input, sorted into ascending order by field <<.field F>>, treating field values as text
op-parameter: accept same parameters as the [[sort Operator]]
op-parameter: the name of a [[field|TiddlerFields]], defaulting to <<.field title>>
op-parameter-name: F
op-purpose: sort the input by text field, treating upper and lower case as different
tags: [[Filter Operators]] [[Field Operators]] [[Order Operators]] [[Negatable Operators]]
@@ -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,5 +1,5 @@
created: 20150414070451144
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]]
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]]
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: Community Survey 2025 Image
caption: Community Survey
link: Community Survey 2025
ribbon-text: NEW
@@ -0,0 +1,9 @@
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
@@ -1,9 +0,0 @@
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: Intertwingled Innovations Image
link: Intertwingled Innovations
tags: HelloThumbnail
title: HelloThumbnail - Intertwingled Innovations
@@ -4,6 +4,7 @@ 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,6 +5,5 @@ 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

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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

@@ -1,4 +0,0 @@
title: Funding
type: image/webp
tags: picture
alt-text: Hand over a debit-card.

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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 161 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

@@ -0,0 +1,4 @@
alt-text: Motovun Jack appreciates incoming donations
tags: picture
title: TiddlyWiki Donation Graphic
type: image/webp
@@ -12,3 +12,15 @@ eg="""<<tabs "[tag[sampletab]]" "SampleTabTwo" "$:/state/tab2" "tc-vertical">>""
<$macrocall $name=".example" n="3"
eg="""<<tabs "[tag[sampletab]nsort[order]]" "SampleTabThree" "$:/state/tab3" "tc-vertical">>"""/>
The following example sets the default tab to be the first tiddler selected in the filter and makes the saved state non-persistent (by using "~$:/temp/"):
<$macrocall $name=".example" n="4"
eg="""<$set name=tl filter="[tag[sampletab]nsort[order]]">
<$transclude $variable=tabs tabsList=<<tl>> default={{{[enlist<tl>]}}} state="$:/temp/state/tab" class="tc-vertical"/>
</$set>"""/>
<<.from-version "5.4.0">> Dynamic parameters can be used to specify the default tab:
<$macrocall $name=".example" n="5"
eg="""<<tabs "[tag[sampletab]nsort[order]]" default={{{[tag[sampletab]nsort[order]]}}} state="$:/temp/state/tab" class="tc-vertical">>"""/>
@@ -1,6 +1,6 @@
caption: Calls
created: 20221007130006705
modified: 20260125212303316
modified: 20260301030947969
tags: WikiText Procedures Functions Macros
title: Calls
type: text/vnd.tiddlywiki
@@ -25,6 +25,12 @@ Each parameter value can be enclosed in `'`single quotes`'`, `"`double quotes`"`
See the discussion about [[parser modes|WikiText parser mode: macro examples]]
!!! Examples
<<testcase TestCases/Calls/ProcedureStaticAttributes>>
<<testcase TestCases/Calls/ProcedureDynamicAttributes>>
!! Calls with <<.wlink TranscludeWidget>> Widget
The shortcut syntax expands to the <<.wlink TranscludeWidget>> widget with the `$variable` attribute specifying the name of the procedure to transclude.
@@ -49,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>
```
```
@@ -3,6 +3,6 @@ description: Fixed Flexoki palette regressions
release: 5.3.8
tags: $:/tags/ChangeNote
change-type: bugfix
change-category: palette
change-category: plugin
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9175
github-contributors: Leilei332
@@ -0,0 +1,10 @@
title: $:/changenotes/5.4.0/#9280
description: Fixed :reverse suffix being ignored by version sort filter
tags: $:/tags/ChangeNote
release: 5.4.0
change-type: bugfix
change-category: filters
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9280
github-contributors: Flibbles
When using the version suffix with the sort filter, the reverse flag had no effect. Fixed.
@@ -0,0 +1,12 @@
title: $:/changenotes/5.4.0/#9297
description: Better support for downloading binary image tiddlers
tags: $:/tags/ChangeNote
release: 5.4.0
change-type: enhancement
change-category: usability
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9297
github-contributors: Flibbles
TiddlyWiki used to convert to blob all tiddlers intended to be downloaded, which is efficient, but interfered with a browser's ability to download binary image data in a way that it recognized.
This isn't necessarily the best solution, but it makes image downloading possible in TiddlyWiki until we require a more sufficient solution.
@@ -4,7 +4,7 @@ release: 5.4.0
tags: $:/tags/ChangeNote
change-type: enhancement
change-category: theme
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9316 https://github.com/TiddlyWiki/TiddlyWiki5/pull/9568
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9316
github-contributors: Leilei332
Replaces hardcoded `fill` attributes with one `fill: currentColor` rule to solve the compatibility issues of migrating to lucide icons.
@@ -1,17 +0,0 @@
title: $:/changenotes/5.4.0/#9397
description: Fix critical freelinks bugs: first character loss and false positive matches in v5.4.0
release: 5.4.0
tags: $:/tags/ChangeNote
change-type: bugfix
change-category: plugin
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9084 https://github.com/TiddlyWiki/TiddlyWiki5/pull/9397
github-contributors: s793016
This note addresses two major bugs introduced in the Freelinks plugin with the v5.4.0 release:
Fixes:
* First Character Loss: The first character of a matched word would incorrectly disappear (e.g., "The" became "he"). This was fixed by correctly timing the filtering of the current tiddler's title during match validation, ensuring proper substring handling.
* False Positive Matches: Unrelated words (like "it is" or "Choose") would incorrectly link to a tiddler title. This was resolved by fixing wrong output merging in the Aho-Corasick failure-link handling, eliminating spurious matches from intermediate nodes, and adding cycle detection.
Impact:
* Significantly improved correctness and reliability of automatic linking for all users, especially in multilingual and large wikis.
@@ -1,9 +0,0 @@
title: $:/changenotes/5.4.0/#9400/impacts/collator
changenote: $:/changenotes/5.4.0/#9400
created: 20251114102355243
modified: 20251114102355243
tags: $:/tags/ImpactNote
description: Tiddlywiki no longer works on browsers that doesn't support [[Intl.Collator|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Collator]]
impact-type: compatibility-break
@@ -1,10 +0,0 @@
title: $:/changenotes/5.4.0/#9400
description: Add locale support for sort operators
release: 5.4.0
tags: $:/tags/ChangeNote
change-type: feature
change-category: filters
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9400
github-contributors: Leilei332
Add a new parameter for `sort`, `nsort`, `sortan`, `sortcs` and `nsortcs` to support sorting with a custom locale.
@@ -0,0 +1,48 @@
title: $:/changenotes/5.4.0/#9676
description: Fix critical freelinks bugs: first character loss and false positive matches in v5.4.0
release: 5.4.0
tags: $:/tags/ChangeNote
change-type: bugfix
change-category: plugin
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9084 https://github.com/TiddlyWiki/TiddlyWiki5/pull/9397 https://github.com/TiddlyWiki/TiddlyWiki5/pull/9676
github-contributors: s793016
Fixes and optimizations to the Freelinks plugin's Aho-Corasick implementation following #9397.
Fixes:
* Failure Links Non-Functional (Critical): The failure link map used a plain object `{}` with trie nodes as keys. Since all JavaScript objects coerce to the same string `[object Object]`, every node resolved to the same map entry. Failure links were silently broken for all overlapping patterns. Fixed by replacing with `WeakMap`.
* Cache Rebuilt on Every UI Interaction (Performance): Any `$:/state/...` update (e.g. clicking tabs) would trigger a full Aho-Corasick rebuild, causing severe lag on large wikis. The `refresh` logic now ignores system tiddlers, with an explicit allowlist for plugin config tiddlers.
* Short Match Blocking Longer Match: A shorter title appearing earlier (e.g. "The New") could prevent a longer overlapping title (e.g. "New York City") from matching. Replaced left-to-right greedy selection with global length-first sorting and interval occupation tracking.
* Unicode Index Desync in ignoreCase Mode: Calling `toLowerCase()` on the full text before searching could change string length (e.g. Turkish "İ" expands), causing `substring()` to split Emoji surrogate pairs and produce garbage output. Case conversion is now done per-character during search.
* Removed Vestigial Regex Escaping: `escapeRegExp()` was called during trie construction but Aho-Corasick operates on literal character transitions, not regex. Removed.
Impact:
* Overlapping titles now match correctly for the first time.
* No cache rebuilds during normal UI interactions on large wikis.
* Correct longest-match behavior for titles sharing substrings.
* Safe Emoji and complex Unicode handling in case-insensitive mode.
#9397
This note addresses two major bugs introduced in the Freelinks plugin with the v5.4.0 release:
Fixes:
* First Character Loss: The first character of a matched word would incorrectly disappear (e.g., "The" became "he"). This was fixed by correctly timing the filtering of the current tiddler's title during match validation, ensuring proper substring handling.
* False Positive Matches: Unrelated words (like "it is" or "Choose") would incorrectly link to a tiddler title. This was resolved by fixing wrong output merging in the Aho-Corasick failure-link handling, eliminating spurious matches from intermediate nodes, and adding cycle detection.
Impact:
* Significantly improved correctness and reliability of automatic linking for all users, especially in multilingual and large wikis.
#9084
This change introduces a fully optimized override of the core text widget, integrating an enhanced Aho-Corasick algorithm for automatic linkification of tiddler titles within text (freelinks). The new implementation prioritizes performance for large wikis and correct support for non-Latin scripts such as Chinese.
Highlights:
- Full switch from regex-based matching to a custom, robust Aho-Corasick engine dedicated to rapid, multi-pattern title detection—drastically decreasing linkification time (tested: 15s reduced to 100500ms on ~12,000 tiddlers).
- Handles extremely large title sets gracefully, including a chunked insertion process and use of a persistent cache (`$:/config/Freelinks/PersistAhoCorasickCache`) to further accelerate subsequent linking operations in large/active wikis.
- Improvements for CJK and non-Latin text: supports linking using long or full-width symbol titles such as '' (U+FF1A) with no split or mismatch.
- Smart prioritization: longer titles are automatically matched before shorter, more ambiguous ones, preventing partial/incorrect linking.
- Actively skips self-linking in the current tiddler and prevents overlapping matches for clean, deterministic linkification.
- End users with large or multilingual wikis see massive performance boost and 100% accurate linking for complex, full-width, or multi-language titles.
- New options for persistent match cache and word boundary checking (`$:/config/Freelinks/WordBoundary`), both can be tuned based on wiki size and content language needs.
- Safe for gradual rollout: legacy behavior is preserved if the new freelinks override is not enabled.
@@ -0,0 +1,13 @@
change-category: hackability
change-type: enhancement
created: 20260228212206750
description: Allows modular relinking behavior for plugin support
github-contributors: flibbles
github-links: https://github.com/TiddlyWiki/TiddlyWiki5/pull/9703
modified: 20260228212206750
release: 5.4.0
tags: $:/tags/ChangeNote
title: $:/changenotes/5.4.0/#9703
type: text/vnd.tiddlywiki
This PR introduces the `relinker` module type so that plugins can introduce behavior whenever a tiddler is renamed. This could be enhanced tiddler relinking behavior, server behavior, or temp tiddler changes.
@@ -9,9 +9,12 @@ description: Under development
\procedure release-introduction()
Release v5.4.0 deliberately and forensically loosens backwards compatibility to clear the path for significant new features and fundamental improvements to be made in the future.
''Please note that there are some changes that do not yet change notes, please see the change history on ~GitHub for the full list of changes.''
See the [[project plan|https://github.com/orgs/TiddlyWiki/projects/4]] for full details.
\end release-introduction
\define banner-credit-user-name() Peter
\define banner-credit-user-link() https://talk.tiddlywiki.org/u/peter
\define banner-credit-discussion-link() https://talk.tiddlywiki.org/t/vote-for-the-banner-tiddlywiki-v5-4-0/15016
\define banner-credit-permalink() https://raw.githubusercontent.com/TiddlyWiki/TiddlyWiki5/92caa7312ebc51c59cd345cc81b4a326661a0650/editions/tw5.com/tiddlers/images/New%20Release%20Banner.webp
<<releasenote 5.4.0>>
@@ -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>
@@ -1,10 +1,14 @@
created: 20130823203800000
modified: 2020051619421803
modified: 20260220093010752
tags: About
title: RoadMap
type: text/vnd.tiddlywiki
TiddlyWiki 5 is now a mature, stable project that is relied upon by many people. Simultaneously, it is rapidly evolving in many directions thanks to the broad community of developers and users. This paradoxical situation is possible because the project strictly maintains backwards compatibility, adding new features alongside the existing ones.
TiddlyWiki was first released in 2013, 9 years after the original [[TiddlyWiki Classic]]. Since then there have been 41 releases, making TiddlyWiki steadily more flexible and reliable. We have ambitious plans for the future as well: v5.4.x, v5.5.x, and eventually TWXX.
There is no formal roadmap, but quite a few areas that have yet to be fully implemented, such as search and replace, and rich text editing. Current work can be found on ~GitHub at https://github.com/TiddlyWiki/TiddlyWiki5/
Our version numbering follows the form v5.x.0. ~TiddlyWiki is currently on v<<version>>, and so we are currently working towards v5.4.0.
There is a detailed project plan on GitHub, but the major milestones are planned as follows:
* TiddlyWiki v5.4.0 will be followed by further v5.4.x releases to fix bugs and incrementally improve features. If there are significant backwards compatibility concerns then those improvements will be pushed into v5.5.0, the next release to make minor backwards comatibility tweaks.
* We'll go on to make v5.6.0, v5.7.0 etc releases until we're ready to release the next major redesign, that is not compromised by backwards compatibility. We are calling this release ~TiddlyWiki XX ("~TiddlyWiki Twenty", or TWXX).
@@ -3,7 +3,6 @@ modified: 20140912135951542
title: $:/DefaultTiddlers
type: text/vnd.tiddlywiki
[[Hire the founder of TiddlyWiki]]
HelloThere
[[Quick Start]]
[[Find Out More]]
@@ -0,0 +1,40 @@
created: 20260301005951330
description: Procedure calls with dynamic attributes
modified: 20260301013907635
tags: $:/tags/wiki-test-spec
title: TestCases/Calls/ProcedureDynamicAttributes
type: text/vnd.tiddlywiki-multiple
title: Narrative
New-style equals sign named parameters support dynamic values
+
title: Output
\function f(a) foo [<a>] :and[join[ ]]
\procedure p(a1) <$text text=<<a1>>/>
<$let v="foo 1" v2="foo 3">
<<p a1=<<v>>>> -
<<p a1=<<f 2>>>> -
<<p a1=`$(v2)$`>> -
<<p a1={{my tiddler}}>> -
<<p a1={{my tiddler!!myfield}}>> -
<<p a1={{{ foo 6 :and[join[ ]] }}}>>
</$let>
+
title: my tiddler
myfield: foo 5
foo 4
+
title: ExpectedResult
<p>
foo 1 -
foo 2 -
foo 3 -
foo 4 -
foo 5 -
foo 6
</p>
@@ -0,0 +1,48 @@
created: 20260301000418824
description: Procedure calls with static attributes
modified: 20260301031128810
tags: $:/tags/wiki-test-spec
title: TestCases/Calls/ProcedureStaticAttributes
type: text/vnd.tiddlywiki-multiple
title: Narrative
Positional, old style colon named parameters, and new-style equals sign named parameters support static values
+
title: Output
\procedure p(a1) <$text text=<<a1>>/>
<<p foo1>> -
<<p a1:foo2>> -
<<p a1=foo3>>
<<p "foo 4">> -
<<p a1:"foo 5">> -
<<p a1="foo 6">>
<<p 'foo 7'>> -
<<p a1:'foo 8'>> -
<<p a1='foo 9'>>
<<p """foo 10""">> -
<<p a1:"""foo 11""">> -
<<p a1="""foo 12""">>
<<p [[foo 13]]>> -
<<p a1:[[foo 14]]>> -
<<p a1=[[foo 15]]>>
+
title: ExpectedResult
<p>foo1 -
foo2 -
foo3</p><p>foo 4 -
foo 5 -
foo 6</p><p>foo 7 -
foo 8 -
foo 9</p><p>foo 10 -
foo 11 -
foo 12</p><p>foo 13 -
foo 14 -
foo 15</p>
@@ -79,3 +79,14 @@ The following is a table with maximum width. It contains [[TextWidget]]s with ma
| Cell1|<$edit-text tiddler="$:/temp/test-table-input" tag="input" field="test"/> |
|^ [[Link to a tiddler]]<br>some more text|<$edit-text tiddler="$:/temp/test-table-input" field="text"/> |
""">>
!! Table with Alternating Row Styles
You will need to create your own stylesheet. See [[Using Stylesheets]]. The idea is to create rules using `:nth-of-type(even/odd)`. For example:
```
.myclass tbody tr:nth-of-type(even) { background-color: <<color tiddler-editor-fields-even>>; }
.myclass tbody tr:nth-of-type(odd) { background-color: <<color tiddler-editor-fields-odd>>; }
```
<<.note """~TiddlyWiki automatically applies classes `evenRow` and `oddRow` to table rows. However, use of these classes is not recommended. Rows start as 'even' (opposite to that expected) and all the rows of the table are considered to be a single combined set of rows, regardless of if they appear in the header, footer, or body.""">>
+3 -2
View File
@@ -4,10 +4,11 @@
"tiddlywiki/browser-sniff",
"tiddlywiki/confetti",
"tiddlywiki/dynannotate",
"tiddlywiki/tour",
"tiddlywiki/internals",
"tiddlywiki/menubar",
"tiddlywiki/railroad"
"tiddlywiki/railroad",
"tiddlywiki/tour",
"tiddlywiki/dom-to-image"
],
"themes": [
"tiddlywiki/vanilla",
+64 -60
View File
@@ -5,6 +5,8 @@ Advanced/Hint: Εσωτερικές πληροφορίες σχετικά με
Appearance/Caption: Εμφάνιση
Appearance/Hint: Τρόποι για να παραμετροποιήσεις την εμφάνιση του TiddlyWiki σου
Basics/AnimDuration/Prompt: Διάρκεια κινούμενων εφέ
Basics/AutoFocus/Prompt: Προεπιλεγμένο πεδίο εστίασης για νέα tiddlers
Basics/AutoFocusEdit/Prompt: Προεπιλεγμένο πεδίο εστίασης για ήδη υπάρχοντα tiddlers
Basics/Caption: Βασικά
Basics/DefaultTiddlers/BottomHint: Χρησιμοποίησε &#91;&#91;διπλές αγκύλες&#93;&#93; για τίτλους με κενά. Ή, μπορείς να διαλέξεις να {{διατηρήσεις τη διάταξη της ιστορίας||$:/snippets/retain-story-ordering-button}}
Basics/DefaultTiddlers/Prompt: Προκαθορισμένα tiddlers
@@ -29,19 +31,19 @@ Basics/Version/Prompt: Έκδοση ~TiddlyWiki
Cascades/Caption: Συζεύξεις
Cascades/Hint: Αυτοί οι καθολικοί κανόνες χρησιμοποιούνται για τη δυναμική επιλογή ορισμένων προτύπων. Το αποτέλεσμα της σύζευξης είναι το αποτέλεσμα του πρώτου φίλτρου στην ακολουθία που επιστρέφει αποτέλεσμα.
Cascades/TagPrompt: Φίλτρα με ετικέτα <$macrocall $name="tag" tag=<<currentTiddler>>/>
EditorTypes/Caption: Τύποι Επεξεργαστών
EditorTypes/Caption: Τύποι επεξεργαστών
EditorTypes/Editor/Caption: Επεξεργαστής
EditorTypes/Hint: Αυτά τα tiddlers καθορίζουν τον επεξεργαστή που θα χρησιμοποιηθεί για την επεξεργασία συγκεκριμένων τύπων tiddler.
EditorTypes/Type/Caption: Τύπος
EditTemplateBody/Caption: Κυρίως Κείμενο Προτύπου Επεξεργασίας
EditTemplateBody/Caption: Κυρίως κείμενο προτύπου επεξεργασίας
EditTemplateBody/Hint: Αυτή η σύζευξη κανόνων χρησιμοποιείται από το προεπιλεγμένο πρότυπο επεξεργασίας για να επιλέξει δυναμικά το πρότυπο για την επεξεργασία του κυρίως κειμένου ενός tiddler.
FieldEditor/Caption: Επεξεργαστής Πεδίων
FieldEditor/Caption: Επεξεργαστής πεδίων
FieldEditor/Hint: Αυτή η σύζευξη κανόνων χρησιμοποιείται για να επελεκτεί δυναμικά το πρότυπο για την απόδοση ενός πεδίου tiddler, με βάση το όνομά του. Χρησιμοποιείται εντός του Προτύπου Επεξεργασίας.
Info/Caption: Πληροφορίες
Info/Hint: Πληροφορίες σχετικα με αυτό το TiddlyWiki
KeyboardShortcuts/Add/Caption: πρόσθεσε συντόμευση
KeyboardShortcuts/Add/Prompt: Πληκτρολόγησε εδώ την συντόμευση
KeyboardShortcuts/Caption: Συντομεύσεις Πληκτρολογίου
KeyboardShortcuts/Caption: Συντομεύσεις πληκτρολογίου
KeyboardShortcuts/Hint: Διαχείριση των αντιστοιχίσεων στις συντομεύσεις πληκτρολογίου
KeyboardShortcuts/NoShortcuts/Caption: Δεν έχουν αντιστοιχηθεί συντομεύσεις πληκτρολογίου
KeyboardShortcuts/Platform/All: Όλες οι πλατφόρμες
@@ -53,7 +55,7 @@ KeyboardShortcuts/Platform/NonWindows: Μόνο για πλατφόρμες εκ
KeyboardShortcuts/Platform/Windows: Μόνο για πλατφόρμα Windows
KeyboardShortcuts/Remove/Hint: αφαίρεσε την συντόμευση
LayoutSwitcher/Caption: Διάταξη
LoadedModules/Caption: Φορτωμένες Μονάδες
LoadedModules/Caption: Φορτωμένες μονάδες
LoadedModules/Hint: Αυτές είναι οι τρέχουσες φορτωμένες tiddler μονάδας που συνδέονται με τα αντίστοιχα τους πηγαία tiddler. Οι μονάδες σε πλάγια γραγή δεν έχουν πηγαίο tiddler, συνήθως επειδή αρχικοποιούνται κατά την διαδικασία εκκίνησης.
Palette/Caption: Παλέτα
Palette/Editor/Clone/Caption: κλωνοποίησε
@@ -66,11 +68,11 @@ Palette/Editor/Reset/Caption: επαναφορά
Palette/HideEditor/Caption: απόκρυψη επεξεργαστή
Palette/Prompt: Τρέχουσα παλέτα:
Palette/ShowEditor/Caption: εμφάνισε τον επεξεργαστή
Parsing/Block/Caption: Κανόνες Συντακτικής Ανάλυσης Τμημάτων
Parsing/Caption: Συντακτική Ανάλυση
Parsing/Block/Caption: Κανόνες συντακτικής ανάλυσης τμημάτων
Parsing/Caption: Συντακτική ανάλυση
Parsing/Hint: Εδώ μπορείς να ενεργοποιήσεις ή να απενεργοποιήσεις καθολικά τους κανόνες τις συντακτικής ανάλυσης του wiki. Για να εφαρμοστούν οι αλλαγές σου, αποθήκευσε και επαναφόρτωσε το wiki. Η απενεργοποίηση συγκεκριμένων κανόνων συντακτικής ανάλυσης ενδέχεται να δημιουργήσει πρόβλημα στην ορθή λειτουργία του <$text text="TiddlyWiki"/>. Χρησιμοποίησε [[ασφαλής λειτουργία|https://tiddlywiki.com/#SafeMode]] για να επανέλθεις στην κανονική λειτουργία..
Parsing/Inline/Caption: Ενσωματωμένοι Κανόνες Συντακτικής Ανάλυσης
Parsing/Pragma/Caption: Κανόνες Συντακτικής Ανάλυσης Για Pragma
Parsing/Inline/Caption: Ενσωματωμένοι κανόνες συντακτικής ανάλυσης
Parsing/Pragma/Caption: Κανόνες συντακτικής ανάλυσης για pragma
Plugins/Add/Caption: Απόκτησε περισσότερα πρόσθετα
Plugins/Add/Hint: Εγκατέστησε πρόσθετα από την επίσημη βιβλιοθήκη
Plugins/AlreadyInstalled/Hint: Το πρόσθετο αυτό έχει ήδη εγκατασταθεί με την έκδοση <$text text=<<installedVersion>>/>
@@ -110,7 +112,7 @@ Plugins/Update/Caption: ενημέρωσε
Plugins/Updates/Caption: Ενημερώσεις
Plugins/Updates/Hint: Διαθέσιμες ενημερώσεις για εγκατεστημένα πρόσθετα
Plugins/Updates/UpdateAll/Caption: Ενημέρωσε <<update-count>> πρόσθετα
Saving/Caption: Αποθηκεύεται
Saving/Caption: Αποθήκευση
Saving/DownloadSaver/AutoSave/Description: Επέτρεψε αυτόματη αποθήκευση για τον Αποθηκευτή Λήψης
Saving/DownloadSaver/AutoSave/Hint: Ενεργοποιεί την αυτόματη αποθήκευση στον Αποθηκευτή Λήψης
Saving/DownloadSaver/Caption: Αποθηκευτής Λήψης
@@ -122,7 +124,7 @@ Saving/GitService/CommitMessage: Αποθηκεύτηκε από το TiddlyWiki
Saving/GitService/Description: Αυτές οι ρυθμίσεις χρησιμοποιούνται μόνο κατά την αποθήκευση στο <<service-name>>
Saving/GitService/Filename: Όνομα αρχείου προορισμού (π.χ. `index.html`)
Saving/GitService/Gitea/Caption: Αποθηκευτής Gitea
Saving/GitService/Gitea/Password: Προσωπικό διακριτικό πρόσβασης για API (μέσω της διεπαφής ιστού του Gitea: `Ρυθμίσεις | Εφαρμογές | Δημιουργία Νέου Διακριτικού`)
Saving/GitService/Gitea/Password: Προσωπικό διακριτικό πρόσβασης για API (μέσω της διεπαφής ιστού του Gitea: `Ρυθμίσεις | Εφαρμογές | Δημιουργία νέου διακριτικού`)
Saving/GitService/GitHub/Caption: Αποθηκευτής ~GitHub
Saving/GitService/GitHub/Password: Κωδικός πρόσβασης, διακριτικό ~OAuth ή προσωπικό διακριτικό πρόσβασης (δες τη [[σελίδα βοήθειας GitHub|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] για λεπτομέρειες)
Saving/GitService/GitLab/Caption: Αποθηκευτής ~GitLab
@@ -133,127 +135,129 @@ Saving/GitService/ServerURL: URL του API του διακομιστή
Saving/GitService/UserName: Όνομα χρήστη
Saving/Heading: Αποθήκευση
Saving/Hint: Ρυθμίσεις που χρησιμοποιούνται για την αποθήκευση ολόκληρου του TiddlyWiki σε ένα αυτοτελής αρχείο μέσω μιας μονάδας αποθήκευσης
Saving/TiddlySpot/Advanced/Heading: Προηγμένες Ρυθμίσεις
Saving/TiddlySpot/BackupDir: Φάκελος Αντιγράφων Ασφαλείας
Saving/TiddlySpot/Backups: Αντίγραφα Ασφαλείας
Saving/TiddlySpot/Advanced/Heading: Προηγμένες ρυθμίσεις
Saving/TiddlySpot/BackupDir: Φάκελος αντιγράφων ασφαλείας
Saving/TiddlySpot/Backups: Αντίγραφα ασφαλείας
Saving/TiddlySpot/Caption: Αποθηκευτής ~TiddlyHost
Saving/TiddlySpot/ControlPanel: Πίνακας Ελέγχου ~TiddlyHost
Saving/TiddlySpot/ControlPanel: Πίνακας ελέγχου ~TiddlyHost
Saving/TiddlySpot/Description: Αυτές οι ρυθμίσεις χρησιμοποιούνται μόνο όταν γίνεται αποθήκευση στο [[TiddlyHost|https://tiddlyhost.com]], ή σε συμβατό απομακρυσμένο εξυπηρετητή. Δες [[τεκμηρίωση στο GitHub|https://github.com/simonbaird/tiddlyhost/wiki/TiddlySpot-Saver-configuration-for-Tiddlyhost-and-Tiddlyspot]] για πληροφορίες περί την ρύθμιση της αποθήκευσης στο ~TiddlyHost
Saving/TiddlySpot/Filename: Αποστολή Αρχείου Με Όνομα
Saving/TiddlySpot/Filename: Αποστολή αρχείου με όνομα
Saving/TiddlySpot/Heading: ~TiddlyHost
Saving/TiddlySpot/Hint: //Το τυπικό URL του εξυπηρετητή είναι `http://<όνομαwiki>.tiddlyspot.com/` και μπορεί να αλλαχθεί για να χρησιμοποιεί διαφορετική διεύθυνση εξυπηρετητή, π.χ. `http://παράδειγμα.com/store.php`.//
Saving/TiddlySpot/Password: Κωδικός
Saving/TiddlySpot/ServerURL: URL Διακομιστή
Saving/TiddlySpot/UploadDir: Αποστολή Σε Φάκελο
Saving/TiddlySpot/UserName: Όνομα Wiki
Settings/AutoSave/Caption: Αυτόματη Αποθήκευση
Saving/TiddlySpot/ServerURL: URL διακομιστή
Saving/TiddlySpot/UploadDir: Αποστολή σε φάκελο
Saving/TiddlySpot/UserName: Όνομα wiki
Settings/AutoSave/Caption: Αυτόματη αποθήκευση
Settings/AutoSave/Disabled/Description: Μην αποθηκεύσεις αυτόματα τις αλλαγές
Settings/AutoSave/Enabled/Description: Αποθήκευσε αυτόματα τις αλλαγές
Settings/AutoSave/Hint: Προσπάθησε να αποθηκεύσεις αυτόματα τις αλλαγές κατά την επεξεργασία, όταν χρησιμοποιώ αποθηκευτή που το υποστηρίζει
Settings/CamelCase/Caption: Σύνδεσμοι Σε Γραφή Με Ενδιάμεσα Κεφαλαία (Camel Case)
Settings/CamelCase/Caption: Σύνδεσμοι σε φραφή με ενδιάμεσα κεφαλαία (camel case)
Settings/CamelCase/Description: Ενεργοποίηση αυτόματης δημιουργίας συνδέσμων ~CamelCase
Settings/CamelCase/Hint: Απαιτείται επαναφόρτωση για να εφαρμοστεί
Settings/CamelCase/Hint: Μπορείς να απενεργοποιήσεις καθολικά την αυτόματη δημιουργία συνδέσμων σε φράσεις ~CamelCase. Απαιτείται επαναφόρτωση για να εφαρμοστεί
Settings/Caption: Ρυθμίσεις
Settings/DefaultMoreSidebarTab/Caption: Προκαθορισμένη Καρτέλα «Περισσότερα» Της Πλευρικής Εργαλειοθήκης
Settings/DefaultMoreSidebarTab/Caption: Προκαθορισμένη καρτέλα «Περισσότερα» της πλευρικής εργαλειοθήκης
Settings/DefaultMoreSidebarTab/Hint: Καθόρισε ποιες καρτέλες εμφανίζεται από προεπιλογή υπό «Περισσότερα» στη πλευρική εργαλειοθήκη
Settings/DefaultSidebarTab/Caption: Προκαθορισμένη Καρτέλα Πλευρικής Εργαλειοθήκης
Settings/DefaultSidebarTab/Caption: Προκαθορισμένη καρτέλα πλευρικής εργαλειοθήκης
Settings/DefaultSidebarTab/Hint: Καθόρισε ποια καρτέλα της πλευρικής εργαλειοθήκης εμφανίζεται αυτομάτως
Settings/DefaultTiddlerInfoTab/Caption: Προκαθορισμένη Καρτέλα Στον Πίνακα Πληροφοριών
Settings/DefaultTiddlerInfoTab/Caption: Προκαθορισμένη καρτέλα στον πίνακα πληροφοριών
Settings/DefaultTiddlerInfoTab/Hint: Καθόρισε ποια καρτέλα στον πίνακα πληροφοριών εμφανίζεται αυτομάτως
Settings/EditorToolbar/Caption: Εργαλειοθήκη Επεξεργασίας
Settings/EditorToolbar/Caption: Εργαλειοθήκη επεξεργασίας
Settings/EditorToolbar/Description: Προβολή εργαλειοθήκης επεξεργασίας
Settings/EditorToolbar/Hint: Ενεργοποίησε ή απενεργοποίησε την εργαλειοθήκη επεξεργασίας:
Settings/Hint: Αυτές οι ρυθμίσεις σου επιτρέπουν να προσαρμόσεις την συμπεριφορά του TiddlyWiki.
Settings/InfoPanelMode/Caption: Λειτουργία Πίνακα Πληροφοριών Tiddler
Settings/InfoPanelMode/Caption: Λειτουργία πίνακα πληροφοριών tiddler
Settings/InfoPanelMode/Hint: Ελέγχει το πότε θα κλείνει ο πίνακας πληροφοριών του tiddler:
Settings/InfoPanelMode/Popup/Description: Ο πίνακας πληροφοριών του tiddler κλείνει αυτόματα
Settings/InfoPanelMode/Sticky/Description: Ο πίνακας πληροφοριών του tiddler παραμένει ανοιχτός εκτός εάν είναι κλειστεί επίτηδες
Settings/LinkToBehaviour/Caption: Συμπεριφορά Ανοίγματος Του Tiddler
Settings/LinkToBehaviour/Caption: Συμπεριφορά ανοίγματος του tiddler
Settings/LinkToBehaviour/InsideRiver/Hint: Πλοήγηση από //εντός// της ροής της ιστορίας
Settings/LinkToBehaviour/OpenAbove: Άνοιγμα πάνω από το παρόν tiddler
Settings/LinkToBehaviour/OpenAtBottom: Άνοιγμα στο κάτω μέρος της ροής της ιστορίας
Settings/LinkToBehaviour/OpenAtTop: Άνοιγμα στο άνω μέρος της ροής της ιστορίας
Settings/LinkToBehaviour/OpenBelow: Άνοιγμα κάτω από το παρόν tiddler
Settings/LinkToBehaviour/OutsideRiver/Hint: Πλοήγηση από //εκτός// της ροής της ιστορίας
Settings/MissingLinks/Caption: Σύνδεσμοι Wiki
Settings/MissingLinks/Caption: Σύνδεσμοι wiki
Settings/MissingLinks/Description: Ενεργοποίηση συνδέσμων σε μη υπαρκτά tiddlers
Settings/MissingLinks/Hint: Επέλεξε αν επιτρέπεται να προσθέσεις συνδέσμους σε tiddler που δεν έχουν ακόμα δημιουργηθεί
Settings/NavigationAddressBar/Caption: Γραμμή Διευθύνσεων Του Περιηγητή
Settings/NavigationAddressBar/Caption: Γραμμή διευθύνσεων του περιηγητή
Settings/NavigationAddressBar/Hint: Η συμπεριφορά της γραμμής διεύθυνσης του προγράμματος περιήγησης όταν μεταβαίνεις σε κάποιο tiddler:
Settings/NavigationAddressBar/No/Description: Μην ενημερώνεις την γραμμή διευθύνσεων
Settings/NavigationAddressBar/Permalink/Description: Συμπεριέλαβε το tiddler προορισμού
Settings/NavigationAddressBar/Permaview/Description: Συμπεριέλαβε το tiddler προορισμού και τη τρέχουσα ακολουθία της ιστορίας
Settings/NavigationHistory/Caption: Ιστορικό Περιήγησης
Settings/NavigationHistory/Caption: Ιστορικό περιήγησης
Settings/NavigationHistory/Hint: Ενημέρωση του ιστορικού στο πρόγραμμα περιήγησης όταν μεταβαίνεις σε κάποιο tiddler:
Settings/NavigationHistory/No/Description: Μην ενημερώνεις το ιστορικό
Settings/NavigationHistory/Yes/Description: Ενημέρωνε το ιστορικό
Settings/NavigationPermalinkviewMode/Caption: Λειτουργία Μόνιμου Σύνδεσμου/Μόνιμης Όψης
Settings/NavigationPermalinkviewMode/Caption: Λειτουργία μόνιμου σύνδεσμου/μόνιμης όψης
Settings/NavigationPermalinkviewMode/CopyToClipboard/Description: Αντέγραψε το URL μόνιμου συνδέσμου/μόνιμης όψης στο πρόχειρο
Settings/NavigationPermalinkviewMode/Hint: Επέλεξε πως χειρίζονται οι μόνιμοι σύνδεσμοι/μόνιμες όψεις:
Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description: Ενημέρωσε τη γραμμή διευθύνσεων με URL μόνιμου συνδέσμου/μόνιμης όψης
Settings/PerformanceInstrumentation/Caption: Επισκόπηση Επιδόσεων
Settings/PerformanceInstrumentation/Caption: Επισκόπηση επιδόσεων
Settings/PerformanceInstrumentation/Description: Ενεργοποίησε τα όργανα επισκόπησης για την επίδοση
Settings/PerformanceInstrumentation/Hint: Εμφανίζει στατιστικά στοιχεία επίδοσης στην κονσόλα προγραμματιστών του προγράμματος περιήγησης. Απαιτείται επαναφόρτωση της σελίδας για να ενεργοποιηθεί.
Settings/RecentLimit/Caption: Όριο Στην Καρτέλα «Προσφάτα»
Settings/RecentLimit/Caption: Όριο στην καρτέλα «Προσφάτα»
Settings/RecentLimit/Hint: Μέγιστος αριθμός tiddlers που θα εμφανίζονται υπό την καρτέλα «Πρόσφατα» της πλευρικής εργαλιοθήκης
Settings/TitleLinks/Caption: Τίτλοι Των Tiddler
Settings/TitleLinks/Caption: Τίτλοι των tiddler
Settings/TitleLinks/Hint: Προαιρετικά εμφάνισε τους τίτλους των tiddler ως συνδέσμους
Settings/TitleLinks/No/Description: Να μην εμφανίζονται οι τίτλοι των tiddler ως σύνδεσμοι
Settings/TitleLinks/Yes/Description: Να εμφανίζονται οι τίτλοι των tiddler ως σύνδεσμοι
Settings/ToolbarButtons/Caption: Κουμπιά Εργαλειοθηκών
Settings/ToolbarButtons/Caption: Κουμπιά εργαλειοθηκών
Settings/ToolbarButtons/Hint: Τυπική εμφάνιση κουμπιού γραμμής εργαλείων:
Settings/ToolbarButtons/Icons/Description: Συμπεριέλαβε εικόνα
Settings/ToolbarButtons/Text/Description: Συμπεριέλαβε κείμενο
Settings/ToolbarButtonStyle/Caption: Στυλ Κουμπιών Εργαλειοθήκης
Settings/ToolbarButtonStyle/Caption: Στυλ κουμπιών εργαλειοθήκης
Settings/ToolbarButtonStyle/Hint: Επέλεξε το ύφος των κουμπιών της εργαλειοθήκης:
Settings/ToolbarButtonStyle/Styles/Borderless: Χωρίς περιθώρια
Settings/ToolbarButtonStyle/Styles/Boxed: Εγκιβωτισμένα
Settings/ToolbarButtonStyle/Styles/Rounded: Στρογγυλοποιημένα
SocialCard/Caption: Κάρτα Κοινωνικών Δικτύων
SocialCard/Caption: Κάρτα κοινωνικών δικτύων
SocialCard/Domain/Prompt: Domain name (όνομα τομέα) που θα εμφανίζεται για τον σύνδεσμο (για παράδειγμα ''tiddlywiki.com'')
SocialCard/Hint: Αυτές οι πληροφορίες χρησιμοποιούνται από τις υπηρεσίες κοινωνικής δικτύωσης και ανταλλαγής μηνυμάτων για να εμφανίσουν κάρτα προεπισκόπησης για συνδέσμους προς αυτό το ~TiddlyWiki, όταν το wiki φιλοξενείται στο διαδίκτυο
SocialCard/PreviewUrl/Preview: Εικόνα προεπισκόπησης:
SocialCard/PreviewUrl/Prompt: Πλήρης διεύθυνση URL προς εικόνα προεπισκόπηση για αυτό το ~TiddlyWiki
SocialCard/Url/Prompt: Πλήρης διεύθυνση URL για αυτό το ~TiddlyWiki
StoryTiddler/Caption: Tiddler Ιστορίας
StoryTiddler/Caption: Tiddler ιστορίας
StoryTiddler/Hint: Αυτή η σύζευξη κανόνων χρησιμοποιείται για να επελεκτεί δυναμικά το πρότυπο για τη προβολή του tiddler στην ιστορική ροή.
StoryView/Caption: Ιστορική Όψη
StoryView/Caption: Ιστορική όψη
StoryView/Prompt: Τρέχουσα όψη:
Stylesheets/Caption: Φύλλα στυλ (stylesheets)
Stylesheets/Expand/Caption: Ανάπτυξη Όλων
Stylesheets/Expand/Caption: Ανάπτυξη όλων
Stylesheets/Hint: Αυτό είναι το CSS που αποδίδεται από τα τρέχοντα tiddlers φύλλου στυλ που έχουν την ετικέτα <<tag "$:/tags/Stylesheet">>
Stylesheets/Restore/Caption: Επαναφορά
TestCases/All/Caption: Όλες οι Δοκιμαστικές Περιπτώσεις
TestCases/All/Hint: Όλες οι Δοκιμαστικές Περιπτώσεις
TestCases/Caption: Δοκιμαστικές Περιπτώσεις
TestCases/Failed/Caption: Αποτυχημένες Δοκιμαστικές Περιπτώσεις
TestCases/Failed/Hint: Μόνο Αποτυχημένες Δοκιμαστικές Περιπτώσεις
TestCases/All/Caption: Όλες οι δοκιμαστικές περιπτώσεις
TestCases/All/Hint: Όλες οι δοκιμαστικές περιπτώσεις
TestCases/Caption: Δοκιμαστικές περιπτώσεις
TestCases/Failed/Caption: Αποτυχημένες δοκιμαστικές περιπτώσεις
TestCases/Failed/Hint: Μόνο αποτυχημένες δοκιμαστικές περιπτώσεις
TestCases/Hint: Οι δοκιμαστικές περιπτώσεις είναι αυτοτελή παραδείγματα για δοκιμές και μάθηση
Theme/Caption: Θέμα
Theme/Prompt: Τρέχον θέμα:
TiddlerColour/Caption: Χρώμα Tiddler
TiddlerColour/Caption: Χρώμα tiddler
TiddlerColour/Hint: Αυτή η σύζευξη κανόνων χρησιμοποιείται για τη δυναμική επιλογή του χρώματος ενός tiddler (χρησιμοποιείται για το εικονίδιο και το συσχετισμένο χάπι ετικέτας).
TiddlerFields/Caption: Πεδία Tiddler
TiddlerFields/Caption: Πεδία tiddler
TiddlerFields/Hint: Αυτή είναι πλήρης καταχώριση από TiddlerFields που χρησιμοποιούνται σε αυτό το wiki· συμπεριλαμβάνονται τα tiddler συστήματος, αλλά εξαιρούνται τα σκιώδη tiddler.
TiddlerIcon/Caption: Εικονίδιο Tiddler
TiddlerIcon/Caption: Εικονίδιο tiddler
TiddlerIcon/Hint: Αυτή η σύζευξη κανόνων χρησιμοποιείται για να επελεκτεί δυναμικά το εικονίδιο για τα tiddler.
Toolbars/Caption: Γραμμές Εργαλείων
Toolbars/EditorToolbar/Caption: Εργαλειοθήκη Επεξεργασίας
Toolbars/Caption: Γραμμές εργαλείων
Toolbars/EditorToolbar/Caption: Εργαλειοθήκη επεξεργασίας
Toolbars/EditorToolbar/Hint: Επέλεξε ποια κουμπιά θα εμφανίζονται στην εργαλειοθήκη επεξεργασίας. Σημειώνουμε πως μερικά κουμπιά θα εμφανίζονται μόνο όταν επεξεργαστείς tiddler συγκεκριμένων τύπων. Μπορείς να αλλάξεις την σειρά με μεταφορά και απόθεση
Toolbars/EditToolbar/Caption: Εργαλειοθήκη Τροποποιήσεων
Toolbars/EditToolbar/Caption: Εργαλειοθήκη τροποποιήσεων
Toolbars/EditToolbar/Hint: Επιλέξτε ποια κουμπιά θα εμφανίζονται στα tiddler που βρίσκονται σε κατάσταση τροποποίησης. Μπορείς να αλλάξεις την σειρά με μεταφορά και απόθεση
Toolbars/Hint: Επιλέξτε ποια κουμπιά της γραμμής εργαλείων θα εμφανίζονται
Toolbars/PageControls/Caption: Εργαλειοθήκη Σελίδας
Toolbars/PageControls/Caption: Εργαλειοθήκη σελίδας
Toolbars/PageControls/Hint: Επέλεξε ποια κουμπιά θα εμφανίζονται στην κύρια εργαλειοθήκη της σελίδας. Μπορείς να αλλάξεις την σειρά με μεταφορά και απόθεση
Toolbars/ViewToolbar/Caption: Εργαλειοθήκη Προβολής
Toolbars/ViewToolbar/Hint: Επιλέξτε ποια κουμπιά θα εμφανίζονται για tiddler σε κατάσταση προβολής. Μπορείς να αλλάξεις την σειρά με μεταφορά και απόθεση
Toolbars/ViewToolbar/Caption: Εργαλειοθήκη προβολής
Toolbars/ViewToolbar/Hint: Επέλεξε ποια κουμπιά θα εμφανίζονται για tiddler σε κατάσταση προβολής. Μπορείς να αλλάξεις την σειρά με μεταφορά και απόθεση
Tools/Download/Full/Caption: Λήψη του πλήρους wiki
ViewTemplateBody/Caption: Κυρίως Κείμενο Προτύπου Προβολής
ViewTemplateBody/Caption: Κυρίως κείμενο προτύπου προβολής
ViewTemplateBody/Hint: Αυτή η σύζευξη κανόνων χρησιμοποιείται από το προεπιλεγμένο πρότυπο προβολής ώστε να επιλέξει δυναμικά το πρότυπο για να προβάλλει το κυρίως κείμενο ενός tiddler.
ViewTemplateSubtitle/Caption: Υπότιτλος Προτύπου Προβολής
ViewTemplateSubtitle/Caption: Υπότιτλος προτύπου προβολής
ViewTemplateSubtitle/Hint: Αυτή η σύζευξη κανόνων χρησιμοποιείται από το προεπιλεγμένο πρότυπο προβολής ώστε να επιλέξει δυναμικά το πρότυπο για να προβάλλει τον υπότιτλο ενός tiddler.
ViewTemplateTags/Caption: Ετικέτες Προτύπου Προβολής
ViewTemplateTags/Caption: Ετικέτες προτύπου προβολής
ViewTemplateTags/Hint: Αυτή η σύζευξη κανόνων χρησιμοποιείται από το προεπιλεγμένο πρότυπο προβολής ώστε να επιλέξει δυναμικά το πρότυπο για να προβάλλει την ενότητα με ετικέτες ενός tiddler.
ViewTemplateTitle/Caption: Τίτλοι Προτύπου Προβολής
ViewTemplateTitle/Caption: Τίτλοι προτύπου προβολής
ViewTemplateTitle/Hint: Αυτή η σύζευξη κανόνων χρησιμοποιείται από το προεπιλεγμένο πρότυπο προβολής ώστε να επιλέξει δυναμικά το πρότυπο για να προβάλλει τον τίτλο ενός tiddler.
WikiInformation/Caption: Πληροφορίες wiki
WikiInformation/Drag/Caption: Σύρε αυτόν τον σύνδεσμο για να αντιγράψεις αυτό το εργαλείο σε άλλο wiki
WikiInformation/Hint: Αυτή η σελίδα συνοψίζει γενικές πληροφορίες σχετικά με τη διαμόρφωση αυτού του ~TiddlyWiki. Έχει σχεδιαστεί για να επιτρέπει στους χρήστες να μοιράζονται γρήγορα σχετικές πτυχές της διαμόρφωσης του ~TiddlyWiki τους με άλλους, για παράδειγμα αν ζητούν βοήθεια σε ένα από τα forum. Δεν περιλαμβάνονται ιδιωτικές ή προσωπικές πληροφορίες και τίποτα δεν κοινοποιείται χωρίς να αντιγραφεί και να επικολληθεί ρητά αλλού

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