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

Compare commits

..

86 Commits

Author SHA1 Message Date
Jeremy Ruston 09193d49c4 Force a rebuild
I don't have time right now to resolve the merge conflicts with master
2025-09-17 14:06:58 +01:00
Jeremy Ruston 356e8e2f23 Fix failing test 2025-05-08 18:08:34 +01:00
Jeremy Ruston 26d9d9fb62 Fix jittery scrolling on lists 2025-05-08 18:05:21 +01:00
Jeremy Ruston c0d9c4f9ec Make the paginated list more reusable 2025-05-08 18:05:08 +01:00
Jeremy Ruston 4351a3d906 Add timing information to filter traces 2025-05-08 15:32:45 +01:00
Jeremy Ruston 728243a66a Add global setting to enable filter observation 2025-05-07 20:49:57 +01:00
Jeremy Ruston 3f733796e5 Include shortcut prefix in traces 2025-05-07 20:49:28 +01:00
Jeremy Ruston 8711726ecd Useful to give the start method access to the widget 2025-05-02 10:29:53 +01:00
Jeremy Ruston 6eddffd7c5 Enable wikitext tests 2025-05-02 10:12:04 +01:00
Jeremy Ruston 29a5a1c571 Merge branch 'master' into filter-inspection 2025-04-30 17:02:26 +01:00
Jeremy Ruston 69f149efef Merge branch 'tiddlywiki-com' 2025-04-29 21:03:58 +01:00
Jeremy Ruston 4060f762e0 Cherry pick 1519ff638d from master 2025-04-29 14:01:43 +01:00
Jeremy Ruston 83da90d4cd Remove unneeded input boxes 2025-04-29 12:40:07 +01:00
Jeremy Ruston 6b2b1df9ad Consolidate identical adjacent lists
Makes things much clearer, but still some formatting and CSS improvements needed
2025-04-29 12:31:14 +01:00
Jeremy Ruston d995e1a87d Fix tricky bug with a dodgy closure 2025-04-29 10:32:25 +01:00
Jeremy Ruston 60165678e4 Fix scrolling of observations 2025-04-29 09:03:58 +01:00
MatthewSalmon 1519ff638d Update JavaScript Macros.tid (#9037)
Removed "tt" in cannot
2025-04-27 21:43:41 +01:00
MatthewSalmon 271b8f9e0d Update cla-individual.md (#9039)
Signing the CLA with GitHub handle
2025-04-27 09:24:16 +01:00
Jeremy Ruston 0b03e79339 New UI for observing filters 2025-04-25 17:40:25 +01:00
Jeremy Ruston 93546c5511 Get rid of reveal widget 2025-04-25 14:50:09 +01:00
Jeremy Ruston e2e14db1f0 Better example filter 2025-04-25 14:36:04 +01:00
Jeremy Ruston 6c59263070 Typo 2025-04-25 14:35:43 +01:00
Jeremy Ruston 628a2a45e6 Make variable usage a bit more logical 2025-04-25 14:34:01 +01:00
Jeremy Ruston 51d79fc5ac Make build-site script more configurable to avoid Netlify timeouts 2025-04-25 14:19:30 +01:00
Jeremy Ruston b4e48bb2b1 Full width buttons are easier to click 2025-04-21 12:26:56 +01:00
Jeremy Ruston 210311eccf Placeholder for advanced search edit box 2025-04-21 11:42:34 +01:00
Jeremy Ruston 2f767cdb28 Docs update 2025-04-21 11:42:18 +01:00
Leilei332 65afdacdfe Remove links in field descriptions (#9036) 2025-04-20 19:44:39 +01:00
Jeremy Ruston 0a0838e753 Merge branch 'master' into filter-inspection 2025-04-16 14:31:11 +01:00
Jeremy Ruston c409d8414e Fix bug exposed by #9030
I think the bug was originally introduced in a9f9ffd409
2025-04-14 22:17:18 +01:00
Rob Hoelz 866e55954f Stringify derived fields for tiddlywiki.files (#9025)
Otherwise, when serializing the tiddlers as JSON when loading plugins,
derived values may end up with the incorrect values.

Take the `modified` field for example - without stringification, it ends
up as something like `new Date(2025, 3, 12, 6, 56, 23)`, which then gets
serialized as `"2025-04-12T11:56:23.000Z"` (in my timezone), rather than
`"20250412115623000"`.  The string `"2025-04-12T11:56:23.000Z"` trips up
TiddlyWiki's date parser upon load, and it gets parsed as
`20250101000000000` instead.

Fixes GH #9021
2025-04-14 18:33:18 +01:00
Mario Pietsch 1e2ce0bc80 Remove function wrapper from development documentation. (#9027) 2025-04-14 18:29:33 +01:00
Mario Pietsch fbeb8cddc8 Remove function wrappers from core/modules (#9028) 2025-04-14 18:29:08 +01:00
Mario Pietsch 73e70e77c1 Remove function wrappers from test editions (#9029) 2025-04-14 18:28:43 +01:00
Mario Pietsch 4e28742aa6 Remove function wrappers from plugins (#9030) 2025-04-14 18:28:04 +01:00
Jeremy Ruston 66196d5c2b More docs tweaks 2025-04-14 16:25:56 +01:00
Jeremy Ruston 483522ea09 Docs tweaks 2025-04-14 15:44:30 +01:00
Jeremy Ruston 3801e2536c Reorganise tiddlers
Some of the titles were not consistent
2025-04-14 10:58:40 +01:00
Jeremy Ruston 77aec1f8f8 Merge branch 'master' into filter-inspection 2025-04-13 17:56:33 +01:00
yaisog 5f551ca46f Change configTiddlerFilter for keyboard-driven-input (#9032) 2025-04-13 17:53:12 +01:00
Jeremy Ruston df529d7d7b Fix RSOD on invalid filter expressions 2025-04-13 17:51:39 +01:00
Leilei332 34cf59d31e Fix some download file types. (#9026) 2025-04-12 15:32:10 +01:00
Jeremy Ruston 8dbb41ba2a Startings of a UI for inspectable filters 2025-04-11 15:42:54 +01:00
Jeremy Ruston b632b75f70 Fix default tab 2025-04-11 14:43:44 +01:00
Jeremy Ruston ef92b899ed Add remote inspection of preconfigured filters
There is no user interface yet, and it is currently hardcoded to inspect the filter "[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!is[draft]]" which is used in tiddler rendering. You can see the results in the sidebar More -> System starting with "$:/temp/filter-inspection/"
2025-04-11 13:33:09 +01:00
Jeremy Ruston dcb8fa2f86 Only display advanced search tabs if there are more than one 2025-04-10 14:11:55 +01:00
Jeremy Ruston c5894c64b9 Missed some styles from refactoring 2025-04-10 14:11:39 +01:00
Jeremy Ruston 04ad642be7 Refactor most of this PR into the "Internals" plugin 2025-04-09 22:01:43 +01:00
Jeremy Ruston c8f17511f9 Improve positioning of the list "more" button 2025-04-07 18:51:31 +01:00
Jeremy Ruston 845b4ba3b5 Rename test 2025-04-07 18:41:40 +01:00
Jeremy Ruston de2cc8637a Merge branch 'tiddlywiki-com' 2025-04-07 17:44:50 +01:00
Jeremy Ruston 8ea00a05d3 Docs update 2025-04-07 17:31:13 +01:00
Jeremy Ruston 28698690b3 Use scrollable widget to maintain scroll position 2025-04-07 16:35:26 +01:00
Jeremy Ruston 3c6ec3f9bb Include separate entries for each evaluation of a run 2025-04-07 16:13:18 +01:00
Jeremy Ruston 3a2c81192e Docs for the inspect-filter macro 2025-04-07 10:42:37 +01:00
Jeremy Ruston d29199ffa8 Fix failing test 2025-04-06 22:13:47 +01:00
Jeremy Ruston e741816a70 Use parse tree to render source text of filter 2025-04-06 22:06:58 +01:00
Jeremy Ruston f315567924 Update MultiWikiServer tiddler 2025-04-06 15:22:25 +01:00
Jeremy Ruston 002c319518 Remove unnecessary text 2025-04-04 10:09:32 +01:00
Jeremy Ruston 33964d460d Add expand/collapse buttons to lists 2025-04-04 10:07:08 +01:00
Jeremy Ruston 9b3e61ef10 Avoid scrolling filter heading 2025-04-03 22:09:28 +01:00
Jeremy Ruston 967e882040 Truncate lists with an "expand" button 2025-04-03 22:03:43 +01:00
Jeremy Ruston 06dfe365be Better docs example 2025-04-03 22:03:12 +01:00
Jeremy Ruston 3e1286013f Fix bug with operators that return an iterator 2025-04-03 21:46:36 +01:00
Jeremy Ruston 1972e8b5f3 Stripy backgrounds for lists 2025-04-03 21:22:33 +01:00
Jeremy Ruston 3cb6712ccb Minimum width for lists 2025-04-03 21:22:18 +01:00
Jeremy Ruston 8b3fbe3134 Fix typo 2025-04-03 14:35:37 +01:00
Jeremy Ruston f6b39d1a40 Add horizontal presentation 2025-04-03 09:26:07 +01:00
Jeremy Ruston 1e10496fd6 Introduce filter visualisation 2025-04-02 22:05:43 +01:00
Jeremy Ruston 5226ca1f75 Comment out logging 2025-04-02 22:04:59 +01:00
Jeremy Ruston 037b4aa227 Add filter output list to JSON 2025-04-02 18:01:15 +01:00
Jeremy Ruston ddeb4fd6e6 Fix filter output 2025-04-02 08:56:28 +01:00
Jeremy Ruston 8ff0cb8650 Fix typo 2025-04-01 17:53:53 +01:00
Jeremy Ruston 27075acbc6 Add "inspect" tab to advanced search and make the search box into a textarea 2025-04-01 12:43:13 +01:00
Jeremy Ruston d4043fc1f4 Add inspect operator 2025-04-01 12:06:10 +01:00
Mario Pietsch 8bda28afd5 Fix typo (#8994) 2025-03-27 17:22:56 +00:00
Mario Pietsch 48fa2be6ac [DOCS] Add HTML Tag info to reveal-widget (#8941) 2025-03-22 20:37:15 +00:00
bobjtls 1b605f0b87 Docs: Addition of example for ActionSetField widget (#8986) 2025-03-22 11:35:56 +00:00
bobjtls 40d53543dc Signing CLA (#8985) 2025-03-22 11:35:15 +00:00
Leilei332 961e74f73d Remove .eslintrc.json (#8987) 2025-03-22 11:32:00 +00:00
Abdullah Ibrahim 4e6a2ffd60 Signing CLA (#8982) 2025-03-17 18:27:54 +00:00
Leilei332 f6a60f51d2 Fix error in geospatial edition tiddlywiki.info file (#8977) 2025-03-17 16:15:28 +00:00
Abdullah Ibrahim 897b14a8d6 Signing CLA (#8983) 2025-03-17 15:51:40 +00:00
Leilei332 c5b465ec99 Make plugin editions use external core (#8952)
* Make some editions use external core

* Revert tw5.com-docs use external js

* Revert "Revert tw5.com-docs use external js"

This reverts commit 93f36cb0af.
2025-03-10 17:28:55 +00:00
Mario Pietsch 9c0fff268c [DOCS] make Filter Operators initial filter run assumption more visible (#8969) 2025-03-03 18:00:39 +00:00
Leilei332 81d8d67800 Update docs for plugin versions (#8968)
* Update docs for plugin versions

Update docs for share plugin.

Add docs for Tour and Geospatial plugin.

* Do not change modified field for some tiddlers
2025-03-03 17:59:23 +00:00
130 changed files with 1483 additions and 1449 deletions
-317
View File
@@ -1,317 +0,0 @@
{
"env": {
"browser": true,
"commonjs": true,
"node": true
},
"extends": [
"eslint:recommended"
],
"globals": {
"$tw": "writable"
},
"parserOptions": {
"ecmaVersion": 5
},
"plugins": [],
"rules": {
"array-bracket-newline": "off",
"array-bracket-spacing": "off",
"array-callback-return": "off",
"array-element-newline": "off",
"arrow-body-style": "error",
"arrow-parens": [
"error",
"as-needed"
],
"arrow-spacing": [
"error",
{
"after": true,
"before": true
}
],
"block-scoped-var": "off",
"block-spacing": "off",
"brace-style": "off",
"callback-return": "off",
"camelcase": "off",
"capitalized-comments": "off",
"class-methods-use-this": "error",
"comma-dangle": "off",
"comma-spacing": "off",
"comma-style": "off",
"complexity": "off",
"computed-property-spacing": "off",
"consistent-return": "off",
"consistent-this": "off",
"curly": "off",
"default-case": "off",
"default-case-last": "error",
"default-param-last": "error",
"dot-location": "off",
"dot-notation": "off",
"eol-last": "off",
"eqeqeq": "off",
"func-call-spacing": "off",
"func-name-matching": "off",
"func-names": "off",
"func-style": "off",
"function-call-argument-newline": "off",
"function-paren-newline": "off",
"generator-star-spacing": "error",
"global-require": "off",
"grouped-accessor-pairs": "error",
"guard-for-in": "off",
"handle-callback-err": "off",
"id-blacklist": "error",
"id-denylist": "error",
"id-length": "off",
"id-match": "error",
"implicit-arrow-linebreak": "error",
"indent": "off",
"indent-legacy": "off",
"init-declarations": "off",
"jsx-quotes": "error",
"key-spacing": "off",
"keyword-spacing": [
"error",
{
"before": true,
"after": false,
"overrides": {
"case": {
"after": true
},
"do": {
"after": true
},
"else": {
"after": true
},
"return": {
"after": true
},
"throw": {
"after": true
},
"try": {
"after": true
},
"catch": {
"after": true
}
}
}
],
"line-comment-position": "off",
"linebreak-style": "off",
"lines-around-comment": "off",
"lines-around-directive": "off",
"lines-between-class-members": "error",
"max-classes-per-file": "error",
"max-depth": "off",
"max-len": "off",
"max-lines": "off",
"max-lines-per-function": "off",
"max-nested-callbacks": "error",
"max-params": "off",
"max-statements": "off",
"max-statements-per-line": "off",
"multiline-comment-style": "off",
"multiline-ternary": "off",
"new-parens": "off",
"newline-after-var": "off",
"newline-before-return": "off",
"newline-per-chained-call": "off",
"no-alert": "off",
"no-array-constructor": "off",
"no-await-in-loop": "error",
"no-bitwise": "off",
"no-buffer-constructor": "off",
"no-caller": "error",
"no-catch-shadow": "off",
"no-confusing-arrow": "error",
"no-console": "off",
"no-constant-condition": [
"error",
{
"checkLoops": false
}
],
"no-constructor-return": "error",
"no-continue": "off",
"no-div-regex": "off",
"no-duplicate-imports": "error",
"no-else-return": "off",
"no-empty-function": "off",
"no-eq-null": "off",
"no-eval": "off",
"no-extend-native": "off",
"no-extra-bind": "off",
"no-extra-label": "off",
"no-extra-parens": "off",
"no-floating-decimal": "off",
"no-implicit-coercion": [
"error",
{
"boolean": false,
"number": false,
"string": false
}
],
"no-implicit-globals": "off",
"no-implied-eval": "error",
"no-inline-comments": "off",
"no-invalid-this": "off",
"no-iterator": "error",
"no-label-var": "off",
"no-labels": "off",
"no-lone-blocks": "off",
"no-lonely-if": "off",
"no-loop-func": "off",
"no-loss-of-precision": "error",
"no-magic-numbers": "off",
"no-mixed-operators": "off",
"no-mixed-requires": "off",
"no-multi-assign": "off",
"no-multi-spaces": "off",
"no-multi-str": "error",
"no-multiple-empty-lines": ["warn", { "max": 4, "maxEOF": 0 }],
"no-native-reassign": "off",
"no-negated-condition": "off",
"no-negated-in-lhs": "error",
"no-nested-ternary": "off",
"no-new": "off",
"no-new-func": "off",
"no-new-object": "off",
"no-new-require": "error",
"no-new-wrappers": "error",
"no-octal-escape": "error",
"no-param-reassign": "off",
"no-path-concat": "error",
"no-plusplus": "off",
"no-process-env": "off",
"no-process-exit": "off",
"no-promise-executor-return": "error",
"no-proto": "off",
"no-restricted-exports": "error",
"no-restricted-globals": "error",
"no-restricted-imports": "error",
"no-restricted-modules": "error",
"no-restricted-properties": "error",
"no-restricted-syntax": "error",
"no-return-assign": "off",
"no-return-await": "error",
"no-script-url": "off",
"no-self-compare": "off",
"no-sequences": "off",
"no-shadow": "off",
"no-spaced-func": "off",
"no-sync": "off",
"no-tabs": "off",
"no-template-curly-in-string": "error",
"no-ternary": "off",
"no-throw-literal": "off",
"no-trailing-spaces": "error",
"no-undef-init": "off",
"no-undefined": "off",
"no-underscore-dangle": "off",
"no-unmodified-loop-condition": "off",
"no-unneeded-ternary": "off",
"no-unreachable-loop": "error",
"no-unused-expressions": "off",
"no-use-before-define": "off",
"no-useless-backreference": "error",
"no-useless-call": "off",
"no-useless-computed-key": "error",
"no-useless-concat": "off",
"no-useless-constructor": "error",
"no-useless-rename": "error",
"no-useless-return": "off",
"no-var": "off",
"no-void": "off",
"no-warning-comments": "off",
"no-whitespace-before-property": "error",
"nonblock-statement-body-position": [
"error",
"any"
],
"object-curly-newline": "off",
"object-curly-spacing": "off",
"object-property-newline": "off",
"object-shorthand": "off",
"one-var": "off",
"one-var-declaration-per-line": "off",
"operator-assignment": "off",
"operator-linebreak": "off",
"padded-blocks": "off",
"padding-line-between-statements": "error",
"prefer-arrow-callback": "off",
"prefer-const": "off",
"prefer-destructuring": "off",
"prefer-exponentiation-operator": "off",
"prefer-named-capture-group": "off",
"prefer-numeric-literals": "error",
"prefer-object-spread": "off",
"prefer-promise-reject-errors": "error",
"prefer-reflect": "off",
"prefer-regex-literals": "off",
"prefer-rest-params": "off",
"prefer-spread": "off",
"prefer-template": "off",
"quote-props": "off",
"quotes": "off",
"radix": "off",
"require-atomic-updates": "error",
"require-await": "error",
"require-jsdoc": "off",
"require-unicode-regexp": "off",
"rest-spread-spacing": "error",
"semi": "off",
"semi-spacing": "off",
"semi-style": "off",
"sort-imports": "error",
"sort-keys": "off",
"sort-vars": "off",
"space-before-blocks": "off",
"space-before-function-paren": "off",
"space-in-parens": "off",
"space-infix-ops": "off",
"space-unary-ops": "off",
"spaced-comment": "off",
"strict": "off",
"switch-colon-spacing": "off",
"symbol-description": "error",
"template-curly-spacing": "error",
"template-tag-spacing": "error",
"unicode-bom": [
"error",
"never"
],
"valid-jsdoc": "off",
"valid-typeof": [
"error",
{
"requireStringLiterals": false
}
],
"vars-on-top": "off",
"wrap-iife": "off",
"wrap-regex": "off",
"yield-star-spacing": "error",
"yoda": "off",
"no-useless-escape": "off",
"no-unused-vars": "off",
"no-empty": "off",
"no-extra-semi": "off",
"no-redeclare": "off",
"no-control-regex": "off",
"no-mixed-spaces-and-tabs": "off",
"no-extra-boolean-cast": "off",
"no-prototype-builtins": "off",
"no-undef": "off",
"no-unreachable": "off",
"no-self-assign": "off"
}
}
+52 -18
View File
@@ -107,20 +107,33 @@ fi
# /index.html Main site
# /external-(version).html External core version of main site
# /favicon.ico Favicon for main site
# /static.html Static rendering of default tiddlers
# /alltiddlers.html Static rendering of all tiddlers
# /static/* Static single tiddlers
# /static/static.css Static stylesheet
# /static/favicon.ico Favicon for static pages
node $TW5_BUILD_TIDDLYWIKI \
$TW5_BUILD_MAIN_EDITION \
--version \
--load $TW5_BUILD_OUTPUT/build.tid \
--output $TW5_BUILD_OUTPUT \
--build favicon static index external-js \
--build favicon index external-js \
|| exit 1
# /static.html Static rendering of default tiddlers
# /alltiddlers.html Static rendering of all tiddlers
# /static/* Static single tiddlers
# /static/static.css Static stylesheet
# /static/favicon.ico Favicon for static pages
# Conditionally build static files if $TW5_BUILD_STATIC variable is not set or is set to 0
if [ -z "$TW5_BUILD_STATIC" ] || [ "$TW5_BUILD_STATIC" = "0" ]; then
node $TW5_BUILD_TIDDLYWIKI \
$TW5_BUILD_MAIN_EDITION \
--version \
--load $TW5_BUILD_OUTPUT/build.tid \
--output $TW5_BUILD_OUTPUT \
--build static \
|| exit 1
fi
# /empty.html Empty
# /empty.hta For Internet Explorer
# /empty-external-core.html External core empty
@@ -156,7 +169,7 @@ node $TW5_BUILD_TIDDLYWIKI \
node $TW5_BUILD_TIDDLYWIKI \
./editions/tour \
--output $TW5_BUILD_OUTPUT \
--rendertiddler $:/core/save/all tour.html text/plain \
--rendertiddler $:/core/save/all-external-js tour.html text/plain \
|| exit 1
# /share.html Custom edition for sharing via the URL
@@ -190,12 +203,15 @@ node $TW5_BUILD_TIDDLYWIKI \
#
######################################################
# Conditionally build editions if $TW5_BUILD_EDITIONS variable is not set or is set to 0
if [ -z "$TW5_BUILD_EDITIONS" ] || [ "$TW5_BUILD_EDITIONS" = "0" ]; then
# /editions/xlsx-utils/index.html xlsx-utils edition
node $TW5_BUILD_TIDDLYWIKI \
./editions/xlsx-utils \
--load $TW5_BUILD_OUTPUT/build.tid \
--output $TW5_BUILD_OUTPUT/editions/xlsx-utils/ \
--build index \
--build external \
|| exit 1
# /editions/resumebuilder/index.html Resume builder edition
@@ -211,7 +227,7 @@ node $TW5_BUILD_TIDDLYWIKI \
./editions/text-slicer \
--load $TW5_BUILD_OUTPUT/build.tid \
--output $TW5_BUILD_OUTPUT/editions/text-slicer/ \
--build index \
--build external \
|| exit 1
# /editions/translators/index.html Translators edition
@@ -243,7 +259,7 @@ node $TW5_BUILD_TIDDLYWIKI \
./editions/tw5.com-docs \
--load $TW5_BUILD_OUTPUT/build.tid \
--output $TW5_BUILD_OUTPUT/editions/tw5.com-docs/ \
--build index \
--build external \
|| exit 1
# /editions/twitter-archivist/index.html Twitter Archivist edition
@@ -254,19 +270,25 @@ node $TW5_BUILD_TIDDLYWIKI \
--build index \
|| exit 1
fi
######################################################
#
# Plugin demos
#
######################################################
# Conditionally build plugin demos if $TW5_BUILD_PLUGIN_DEMOS variable is not set
if [ -z "$TW5_BUILD_PLUGIN_DEMOS" ] || [ "$TW5_BUILD_PLUGIN_DEMOS" = "0" ]; then
# /plugins/tiddlywiki/innerwiki/index.html Demo wiki with Innerwiki plugin
node $TW5_BUILD_TIDDLYWIKI \
./editions/innerwikidemo \
--load $TW5_BUILD_OUTPUT/build.tid \
--output $TW5_BUILD_OUTPUT \
--rendertiddler $:/core/save/all plugins/tiddlywiki/innerwiki/index.html text/plain \
--rendertiddler $:/core/save/all-external-js plugins/tiddlywiki/innerwiki/index.html text/plain \
|| exit 1
# /plugins/tiddlywiki/dynaview/index.html Demo wiki with DynaView plugin
@@ -276,7 +298,7 @@ node $TW5_BUILD_TIDDLYWIKI \
./editions/dynaviewdemo \
--load $TW5_BUILD_OUTPUT/build.tid \
--output $TW5_BUILD_OUTPUT \
--rendertiddler $:/core/save/all plugins/tiddlywiki/dynaview/index.html text/plain \
--rendertiddler $:/core/save/all-external-js plugins/tiddlywiki/dynaview/index.html text/plain \
--rendertiddler $:/core/save/empty plugins/tiddlywiki/dynaview/empty.html text/plain \
|| exit 1
@@ -290,7 +312,7 @@ node $TW5_BUILD_TIDDLYWIKI \
./editions/katexdemo \
--load $TW5_BUILD_OUTPUT/build.tid \
--output $TW5_BUILD_OUTPUT \
--rendertiddler $:/core/save/all plugins/tiddlywiki/katex/index.html text/plain \
--rendertiddler $:/core/save/all-external-js plugins/tiddlywiki/katex/index.html text/plain \
--rendertiddler $:/core/save/empty plugins/tiddlywiki/katex/empty.html text/plain \
|| exit 1
@@ -320,7 +342,7 @@ node $TW5_BUILD_TIDDLYWIKI \
./editions/codemirrordemo \
--load $TW5_BUILD_OUTPUT/build.tid \
--output $TW5_BUILD_OUTPUT \
--rendertiddler $:/core/save/all plugins/tiddlywiki/codemirror/index.html text/plain \
--rendertiddler $:/core/save/all-external-js plugins/tiddlywiki/codemirror/index.html text/plain \
--rendertiddler $:/core/save/empty plugins/tiddlywiki/codemirror/empty.html text/plain \
|| exit 1
@@ -330,7 +352,7 @@ node $TW5_BUILD_TIDDLYWIKI \
./editions/markdowndemo \
--load $TW5_BUILD_OUTPUT/build.tid \
--output $TW5_BUILD_OUTPUT \
--rendertiddler $:/core/save/all plugins/tiddlywiki/markdown/index.html text/plain \
--rendertiddler $:/core/save/all-external-js plugins/tiddlywiki/markdown/index.html text/plain \
--rendertiddler $:/core/save/empty plugins/tiddlywiki/markdown/empty.html text/plain \
|| exit 1
@@ -340,7 +362,7 @@ node $TW5_BUILD_TIDDLYWIKI \
./editions/classicparserdemo \
--load $TW5_BUILD_OUTPUT/build.tid \
--output $TW5_BUILD_OUTPUT \
--rendertiddler $:/core/save/all plugins/tiddlywiki/tw2parser/index.html text/plain \
--rendertiddler $:/core/save/all-external-js plugins/tiddlywiki/tw2parser/index.html text/plain \
--rendertiddler $:/core/save/empty plugins/tiddlywiki/tw2parser/empty.html text/plain \
|| exit 1
@@ -350,7 +372,7 @@ node $TW5_BUILD_TIDDLYWIKI \
./editions/highlightdemo \
--load $TW5_BUILD_OUTPUT/build.tid \
--output $TW5_BUILD_OUTPUT \
--rendertiddler $:/core/save/all plugins/tiddlywiki/highlight/index.html text/plain \
--rendertiddler $:/core/save/all-external-js plugins/tiddlywiki/highlight/index.html text/plain \
--rendertiddler $:/core/save/empty plugins/tiddlywiki/highlight/empty.html text/plain \
|| exit 1
@@ -360,16 +382,21 @@ node $TW5_BUILD_TIDDLYWIKI \
./editions/geospatialdemo \
--load $TW5_BUILD_OUTPUT/build.tid \
--output $TW5_BUILD_OUTPUT \
--rendertiddler $:/core/save/all plugins/tiddlywiki/geospatial/index.html text/plain \
--rendertiddler $:/core/save/all-external-js plugins/tiddlywiki/geospatial/index.html text/plain \
--rendertiddler $:/core/save/empty plugins/tiddlywiki/geospatial/empty.html text/plain \
|| exit 1
fi
######################################################
#
# Language editions
#
######################################################
# Conditionally build language editions if $TW5_BUILD_LANGUAGE_DEMOS variable is not set
if [ -z "$TW5_BUILD_LANGUAGE_DEMOS" ] || [ "$TW5_BUILD_LANGUAGE_DEMOS" = "0" ]; then
# Delete any existing static content
rm -rf $TW5_BUILD_OUTPUT/languages/de-AT/static/*
@@ -453,12 +480,17 @@ node $TW5_BUILD_TIDDLYWIKI \
--build empty index \
|| exit 1
fi
######################################################
#
# Plugin library
#
######################################################
# Conditionally build plugin library if $TW5_BUILD_PLUGIN_LIBRARY variable is not set
if [ -z "$TW5_BUILD_PLUGIN_LIBRARY" ] || [ "$TW5_BUILD_PLUGIN_LIBRARY" = "0" ]; then
node $TW5_BUILD_TIDDLYWIKI \
./editions/pluginlibrary \
--load $TW5_BUILD_OUTPUT/build.tid \
@@ -466,6 +498,8 @@ node $TW5_BUILD_TIDDLYWIKI \
--build library\
|| exit 1
fi
# Delete the temporary build tiddler
rm $TW5_BUILD_OUTPUT/build.tid || exit 1
+128 -180
View File
@@ -1068,10 +1068,6 @@ $tw.Tiddler.prototype.hasField = function(field) {
return $tw.utils.hop(this.fields,field);
};
$tw.Tiddler.prototype.isPlugin = function() {
return this.fields.type === "application/json" && this.hasField("plugin-type") && !this.hasField("draft.of");
};
/*
Compare two tiddlers for equality
tiddler: the tiddler to compare
@@ -1166,21 +1162,21 @@ enableIndexers - Array of indexer names to enable, or null to use all available
$tw.Wiki = function(options) {
options = options || {};
var self = this,
tiddlerStore = Object.create(null), // Hashmap of tiddlers
tiddlerTitles = null, // Array of tiddler titles, calculated and cached when needed
tiddlers = Object.create(null), // Hashmap of tiddlers
tiddlerTitles = null, // Array of tiddler titles
getTiddlerTitles = function() {
if(!tiddlerTitles) {
tiddlerTitles = Object.keys(tiddlerStore).sort(function(a,b) {return a.localeCompare(b);});
tiddlerTitles = Object.keys(tiddlers).sort(function(a,b) {return a.localeCompare(b);});
}
return tiddlerTitles;
},
pluginTiddlersInfo = [], // Array of tiddler fields for all plugins and sub-plugins, ordered by priority
pluginContents = Object.create(null), // Hashmap by title of {contents:<parsed plugin contents>,fields:<fields>,subPluginTitles:<list>}
shadowTiddlerInfo = Object.create(null), // Hashmap by title of {source:, tiddler:}
shadowTiddlerTitles = null, // Array of tiddler titles, calculated and cached when needed
pluginTiddlers = [], // Array of tiddlers containing registered plugins, ordered by priority
pluginInfo = Object.create(null), // Hashmap of parsed plugin content
shadowTiddlers = Object.create(null), // Hashmap by title of {source:, tiddler:}
shadowTiddlerTitles = null,
getShadowTiddlerTitles = function() {
if(!shadowTiddlerTitles) {
shadowTiddlerTitles = Object.keys(shadowTiddlerInfo).sort(function(a,b) {return a.localeCompare(b);});
shadowTiddlerTitles = Object.keys(shadowTiddlers).sort(function(a,b) {return a.localeCompare(b);});
}
return shadowTiddlerTitles;
},
@@ -1222,7 +1218,7 @@ $tw.Wiki = function(options) {
}
}
// Save the new tiddler
tiddlerStore[title] = tiddler;
tiddlers[title] = tiddler;
// Check we've got the title
tiddlerTitles = $tw.utils.insertSortedArray(tiddlerTitles || [],title);
// Record the new tiddler state
@@ -1247,7 +1243,7 @@ $tw.Wiki = function(options) {
this.deleteTiddler = function(title) {
// Uncomment the following line for detailed logs of all tiddler deletions
// console.log("Deleting",title)
if($tw.utils.hop(tiddlerStore,title)) {
if($tw.utils.hop(tiddlers,title)) {
// Record the old tiddler state
var updateDescriptor = {
old: {
@@ -1257,7 +1253,7 @@ $tw.Wiki = function(options) {
}
}
// Delete the tiddler
delete tiddlerStore[title];
delete tiddlers[title];
// Delete it from the list of titles
if(tiddlerTitles) {
var index = tiddlerTitles.indexOf(title);
@@ -1285,11 +1281,11 @@ $tw.Wiki = function(options) {
// Get a tiddler from the store
this.getTiddler = function(title) {
if(title) {
var t = tiddlerStore[title];
var t = tiddlers[title];
if(t !== undefined) {
return t;
} else {
var s = shadowTiddlerInfo[title];
var s = shadowTiddlers[title];
if(s !== undefined) {
return s.tiddler;
}
@@ -1309,7 +1305,7 @@ $tw.Wiki = function(options) {
index,titlesLength,title;
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
callback(tiddlerStore[title],title);
callback(tiddlers[title],title);
}
};
@@ -1324,10 +1320,10 @@ $tw.Wiki = function(options) {
index,titlesLength,title;
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
if(tiddlerStore[title]) {
callback(tiddlerStore[title],title);
if(tiddlers[title]) {
callback(tiddlers[title],title);
} else {
var shadowInfo = shadowTiddlerInfo[title];
var shadowInfo = shadowTiddlers[title];
callback(shadowInfo.tiddler,title);
}
}
@@ -1339,13 +1335,13 @@ $tw.Wiki = function(options) {
titles = getTiddlerTitles();
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
callback(tiddlerStore[title],title);
callback(tiddlers[title],title);
}
titles = getShadowTiddlerTitles();
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
if(!tiddlerStore[title]) {
var shadowInfo = shadowTiddlerInfo[title];
if(!tiddlers[title]) {
var shadowInfo = shadowTiddlers[title];
callback(shadowInfo.tiddler,title);
}
}
@@ -1357,35 +1353,35 @@ $tw.Wiki = function(options) {
titles = getShadowTiddlerTitles();
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
if(tiddlerStore[title]) {
callback(tiddlerStore[title],title);
if(tiddlers[title]) {
callback(tiddlers[title],title);
} else {
var shadowInfo = shadowTiddlerInfo[title];
var shadowInfo = shadowTiddlers[title];
callback(shadowInfo.tiddler,title);
}
}
titles = getTiddlerTitles();
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
if(!shadowTiddlerInfo[title]) {
callback(tiddlerStore[title],title);
if(!shadowTiddlers[title]) {
callback(tiddlers[title],title);
}
}
};
// Test for the existence of a tiddler (excludes shadow tiddlers)
this.tiddlerExists = function(title) {
return !!$tw.utils.hop(tiddlerStore,title);
return !!$tw.utils.hop(tiddlers,title);
};
// Determines if a tiddler is a shadow tiddler, regardless of whether it has been overridden by a real tiddler
this.isShadowTiddler = function(title) {
return $tw.utils.hop(shadowTiddlerInfo,title);
return $tw.utils.hop(shadowTiddlers,title);
};
this.getShadowSource = function(title) {
if($tw.utils.hop(shadowTiddlerInfo,title)) {
return shadowTiddlerInfo[title].source;
if($tw.utils.hop(shadowTiddlers,title)) {
return shadowTiddlers[title].source;
}
return null;
};
@@ -1393,8 +1389,8 @@ $tw.Wiki = function(options) {
// Get an array of all the currently recognised plugin types
this.getPluginTypes = function() {
var types = [];
$tw.utils.each(pluginTiddlersInfo,function(pluginTiddlerFields) {
var pluginType = pluginTiddlerFields["plugin-type"];
$tw.utils.each(pluginTiddlers,function(pluginTiddler) {
var pluginType = pluginTiddler.fields["plugin-type"];
if(pluginType && types.indexOf(pluginType) === -1) {
types.push(pluginType);
}
@@ -1402,45 +1398,22 @@ $tw.Wiki = function(options) {
return types;
};
// Read plugin contents for all plugins, or just an array of titles. Returns the list of updated plugin titles, the list of deleted plugin titles and
// a hashmap of the deleted plugin contents. Clears the pluginContents cache for any plugins that have been deleted
// Read plugin info for all plugins, or just an array of titles. Returns the number of plugins updated or deleted
this.readPluginInfo = function(titles) {
var self = this,
results = {
var results = {
modifiedPlugins: [],
deletedPlugins: [],
deletedPluginContents: {}
deletedPlugins: []
};
$tw.utils.each(titles || getTiddlerTitles(),function(title) {
var tiddler = self.getTiddler(title);
if(!tiddler) {
for(var t=0; t<pluginContents.length; t++) {
if(pluginContents[t].subPluginTitles.indexOf(title) !== -1) {
tiddler = new $tw.Tiddler(pluginContents[t].fields);
break;
}
}
}
var tiddler = tiddlers[title];
if(tiddler) {
if(tiddler.isPlugin() && tiddler.fields.text) {
var contents = $tw.utils.parseJSONSafe(tiddler.fields.text).tiddlers;
var subPluginTitles = [];
// Read any sub-plugins
$tw.utils.each(contents,function(subPluginFields,subPluginTitle) {
if(subPluginFields["plugin-type"] && subPluginFields["type"] === "application/json") {
var contents = $tw.utils.parseJSONSafe(subPluginFields.text).tiddlers
pluginContents[subPluginTitle] = {contents: contents,fields: subPluginFields};
results.modifiedPlugins.push(subPluginTitle);
subPluginTitles.push(subPluginTitle)
}
});
pluginContents[title] = {contents: contents,fields: tiddler.fields,subPluginTitles: subPluginTitles};
results.modifiedPlugins.push(title);
if(tiddler.fields.type === "application/json" && tiddler.hasField("plugin-type") && tiddler.fields.text) {
pluginInfo[tiddler.fields.title] = $tw.utils.parseJSONSafe(tiddler.fields.text);
results.modifiedPlugins.push(tiddler.fields.title);
}
} else {
if(pluginContents[title]) {
results.deletedPluginContents[title] = {tiddlers: pluginContents[title].contents};
delete pluginContents[title];
if(pluginInfo[title]) {
delete pluginInfo[title];
results.deletedPlugins.push(title);
}
}
@@ -1448,42 +1421,34 @@ $tw.Wiki = function(options) {
return results;
};
this.isSubPlugin = function(title) {
for(var t=0; t<pluginContents.length; t++) {
if(pluginContents[t].subPluginTitles.indexOf(title) !== -1) {
return true;
}
}
return false;
};
// Get plugin info for a plugin
this.getPluginInfo = function(title) {
var pluginContent = pluginContents[title];
if(pluginContent) {
return {tiddlers: pluginContent.contents, subPluginTitles: pluginContent.subPluginTitles, fields: pluginContent.fields};
} else {
return null;
}
return pluginInfo[title];
};
// Register the plugin tiddlers of a particular type, or null/undefined for any type, optionally restricting registration to an array of tiddler titles. Return the array of titles affected
this.registerPluginTiddlers = function(pluginType,titles) {
var self = this,
registeredTitles = [];
$tw.utils.each(pluginContents,function(pluginContent,pluginTitle) {
var pluginFields = pluginContent.fields;
if(!titles || titles.indexOf(pluginTitle) !== -1) {
if(!pluginType || pluginFields["plugin-type"] === pluginType) {
var disablingTiddler = self.getTiddler("$:/config/Plugins/Disabled/" + pluginTitle);
if(pluginTitle === "$:/core" || !disablingTiddler || (disablingTiddler.fields.text || "").trim() !== "yes") {
self.unregisterPluginTiddlers(null,[pluginTitle]); // Unregister the plugin if it's already registered
pluginTiddlersInfo.push(pluginFields);
registeredTitles.push(pluginTitle);
registeredTitles = [],
checkTiddler = function(tiddler,title) {
if(tiddler && tiddler.fields.type === "application/json" && tiddler.fields["plugin-type"] && (!pluginType || tiddler.fields["plugin-type"] === pluginType)) {
var disablingTiddler = self.getTiddler("$:/config/Plugins/Disabled/" + title);
if(title === "$:/core" || !disablingTiddler || (disablingTiddler.fields.text || "").trim() !== "yes") {
self.unregisterPluginTiddlers(null,[title]); // Unregister the plugin if it's already registered
pluginTiddlers.push(tiddler);
registeredTitles.push(tiddler.fields.title);
}
}
}
});
};
if(titles) {
$tw.utils.each(titles,function(title) {
checkTiddler(self.getTiddler(title),title);
});
} else {
this.each(function(tiddler,title) {
checkTiddler(tiddler,title);
});
}
return registeredTitles;
};
@@ -1492,11 +1457,11 @@ $tw.Wiki = function(options) {
var self = this,
unregisteredTitles = [];
// Remove any previous registered plugins of this type
for(var t=pluginTiddlersInfo.length-1; t>=0; t--) {
var pluginFields = pluginTiddlersInfo[t];
if(pluginFields["plugin-type"] && (!pluginType || pluginFields["plugin-type"] === pluginType) && (!titles || titles.indexOf(pluginFields.title) !== -1)) {
unregisteredTitles.push(pluginFields.title);
pluginTiddlersInfo.splice(t,1);
for(var t=pluginTiddlers.length-1; t>=0; t--) {
var tiddler = pluginTiddlers[t];
if(tiddler.fields["plugin-type"] && (!pluginType || tiddler.fields["plugin-type"] === pluginType) && (!titles || titles.indexOf(tiddler.fields.title) !== -1)) {
unregisteredTitles.push(tiddler.fields.title);
pluginTiddlers.splice(t,1);
}
}
return unregisteredTitles;
@@ -1506,33 +1471,36 @@ $tw.Wiki = function(options) {
this.unpackPluginTiddlers = function() {
var self = this;
// Sort the plugin titles by the `plugin-priority` field, if this field is missing, default to 1
pluginTiddlersInfo.sort(function(a, b) {
var priorityA = "plugin-priority" in a ? a["plugin-priority"] : 1,
priorityB = "plugin-priority" in b ? b["plugin-priority"] : 1;
pluginTiddlers.sort(function(a, b) {
var priorityA = "plugin-priority" in a.fields ? a.fields["plugin-priority"] : 1;
var priorityB = "plugin-priority" in b.fields ? b.fields["plugin-priority"] : 1;
if (priorityA !== priorityB) {
return priorityA - priorityB;
} else if (a.title < b.title) {
} else if (a.fields.title < b.fields.title) {
return -1;
} else if (a.title === b.title) {
} else if (a.fields.title === b.fields.title) {
return 0;
} else {
return +1;
}
});
// Now go through the plugins in ascending order and assign the shadows
shadowTiddlerInfo = Object.create(null);
$tw.utils.each(pluginTiddlersInfo,function(tiddlerFields) {
var contents = pluginContents[tiddlerFields.title].contents;
shadowTiddlers = Object.create(null);
$tw.utils.each(pluginTiddlers,function(tiddler) {
// Extract the constituent tiddlers
$tw.utils.each(contents,function(constituentTiddler,constituentTitle) {
// Save the tiddler object
shadowTiddlerInfo[constituentTitle] = {
source: tiddlerFields.title,
tiddler: new $tw.Tiddler(constituentTiddler,{title: constituentTitle})
};
});
if($tw.utils.hop(pluginInfo,tiddler.fields.title)) {
$tw.utils.each(pluginInfo[tiddler.fields.title].tiddlers,function(constituentTiddler,constituentTitle) {
// Save the tiddler object
if(constituentTitle) {
shadowTiddlers[constituentTitle] = {
source: tiddler.fields.title,
tiddler: new $tw.Tiddler(constituentTiddler,{title: constituentTitle})
};
}
});
}
});
shadowTiddlerTitles = null; // Force regeneration of the shadow tiddler titles list
shadowTiddlerTitles = null;
this.clearCache(null);
this.clearGlobalCache();
$tw.utils.each(indexers,function(indexer) {
@@ -1976,7 +1944,7 @@ $tw.boot.excludeRegExp = /^\.DS_Store$|^.*\.meta$|^\..*\.swp$|^\._.*$|^\.git$|^\
/*
Load all the tiddlers recursively from a directory, including honouring `tiddlywiki.files` files for drawing in external files. Returns an array of {filepath:,type:,tiddlers: [{..fields...}],hasMetaFile:}. Note that no file information is returned for externally loaded tiddlers, just the `tiddlers` property.
*/
$tw.loadTiddlersFromPath = function(filepath,excludeRegExp,excludePluginInfo) {
$tw.loadTiddlersFromPath = function(filepath,excludeRegExp) {
excludeRegExp = excludeRegExp || $tw.boot.excludeRegExp;
var tiddlers = [];
if(fs.existsSync(filepath)) {
@@ -1986,17 +1954,11 @@ $tw.loadTiddlersFromPath = function(filepath,excludeRegExp,excludePluginInfo) {
// Look for a tiddlywiki.files file
if(files.indexOf("tiddlywiki.files") !== -1) {
Array.prototype.push.apply(tiddlers,$tw.loadTiddlersFromSpecification(filepath,excludeRegExp));
} else if(files.indexOf("plugin.info") !== -1 && !excludePluginInfo) {
// Load sub-plugin
var tiddler = $tw.loadPluginFolder(filepath);
if(tiddler) {
tiddlers.push({tiddlers: [tiddler]});
}
} else {
// If not, read all the files in the directory
$tw.utils.each(files,function(file) {
if(!excludeRegExp.test(file) && file !== "plugin.info") {
tiddlers.push.apply(tiddlers,$tw.loadTiddlersFromPath(path.join(filepath,file),excludeRegExp));
tiddlers.push.apply(tiddlers,$tw.loadTiddlersFromPath(filepath + path.sep + file,excludeRegExp));
}
});
}
@@ -2038,7 +2000,7 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
var value = tiddler[name];
switch(fieldInfo.source) {
case "subdirectories":
value = path.relative(rootPath, filename).split(path.sep).slice(0, -1);
value = $tw.utils.stringifyList(path.relative(rootPath, filename).split(path.sep).slice(0, -1));
break;
case "filepath":
value = path.relative(rootPath, filename).split(path.sep).join('/');
@@ -2059,10 +2021,10 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
value = path.extname(filename);
break;
case "created":
value = new Date(fs.statSync(pathname).birthtime);
value = $tw.utils.stringifyDate(new Date(fs.statSync(pathname).birthtime));
break;
case "modified":
value = new Date(fs.statSync(pathname).mtime);
value = $tw.utils.stringifyDate(new Date(fs.statSync(pathname).mtime));
break;
}
if(fieldInfo.prefix) {
@@ -2143,69 +2105,54 @@ Load the tiddlers from a plugin folder, and package them up into a proper JSON p
*/
$tw.loadPluginFolder = function(filepath,excludeRegExp) {
excludeRegExp = excludeRegExp || $tw.boot.excludeRegExp;
function readPluginFields(filepath) {
if(!(fs.existsSync(filepath) && fs.statSync(filepath).isDirectory())) {
return null;
}
var infoPath = path.join(filepath,"plugin.info");
// Read the plugin information file
var infoPath = filepath + path.sep + "plugin.info";
if(fs.existsSync(filepath) && fs.statSync(filepath).isDirectory()) {
// Read the plugin information
if(!fs.existsSync(infoPath) || !fs.statSync(infoPath).isFile()) {
console.log("Warning: missing plugin.info file in " + filepath);
return null;
}
var pluginFields = $tw.utils.parseJSONSafe(fs.readFileSync(infoPath,"utf8"),{});
if(!(pluginFields.title && pluginFields.name)) {
return null;
var pluginInfo = $tw.utils.parseJSONSafe(fs.readFileSync(infoPath,"utf8"),function() {return null;});
if(!pluginInfo) {
console.log("warning: invalid JSON in plugin.info file at " + infoPath);
pluginInfo = {};
}
// Give the plugin the same version number as the core if it doesn't have one
if(!("version" in pluginFields)) {
pluginFields.version = $tw.packageInfo.version;
}
// Use "plugin" as the plugin-type if we don't have one
if(!("plugin-type" in pluginFields)) {
pluginFields["plugin-type"] = "plugin";
}
// Set the dependents and type
pluginFields.dependents = pluginFields.dependents || [];
pluginFields.type = "application/json";
// Deserialise array fields (currently required for the dependents field)
for(var field in pluginFields) {
if($tw.utils.isArray(pluginFields[field])) {
pluginFields[field] = $tw.utils.stringifyList(pluginFields[field]);
}
}
return pluginFields;
}
function readPluginTiddlers(tiddlersPath) {
var pluginFiles = $tw.loadTiddlersFromPath(tiddlersPath,excludeRegExp,true),
pluginTiddlers = {};
// Save the plugin tiddlers into the plugin payload
// Read the plugin files
var pluginFiles = $tw.loadTiddlersFromPath(filepath,excludeRegExp);
// Save the plugin tiddlers into the plugin info
pluginInfo.tiddlers = pluginInfo.tiddlers || Object.create(null);
for(var f=0; f<pluginFiles.length; f++) {
var tiddlers = pluginFiles[f].tiddlers;
if(!tiddlers) {
console.log(`Gosh ${JSON.stringify(pluginFiles[f])}`)
}
for(var t=0; t<tiddlers.length; t++) {
var tiddler= tiddlers[t];
if(tiddler.title) {
pluginTiddlers[tiddler.title] = tiddler;
pluginInfo.tiddlers[tiddler.title] = tiddler;
}
}
}
return pluginTiddlers;
// Give the plugin the same version number as the core if it doesn't have one
if(!("version" in pluginInfo)) {
pluginInfo.version = $tw.packageInfo.version;
}
// Use "plugin" as the plugin-type if we don't have one
if(!("plugin-type" in pluginInfo)) {
pluginInfo["plugin-type"] = "plugin";
}
pluginInfo.dependents = pluginInfo.dependents || [];
pluginInfo.type = "application/json";
// Set plugin text
pluginInfo.text = JSON.stringify({tiddlers: pluginInfo.tiddlers});
delete pluginInfo.tiddlers;
// Deserialise array fields (currently required for the dependents field)
for(var field in pluginInfo) {
if($tw.utils.isArray(pluginInfo[field])) {
pluginInfo[field] = $tw.utils.stringifyList(pluginInfo[field]);
}
}
return pluginInfo;
} else {
return null;
}
// Get the primary plugin fields
var pluginFields = readPluginFields(filepath);
if(!pluginFields) {
console.log("Warning: missing or invalid plugin.info file in " + filepath);
return null;
}
// The payload to be stored in the plugin text field in JSON
var pluginPayload = {tiddlers: {}};
// Get the constituent tiddlers of the plugin
pluginPayload.tiddlers = readPluginTiddlers(filepath);
// Set plugin text
pluginFields.text = JSON.stringify(pluginPayload);
return pluginFields;
};
/*
@@ -2785,14 +2732,15 @@ $tw.hooks.removeHook = function(hookName,definition) {
/*
Invoke the hook by key
*/
$tw.hooks.invokeHook = function(hookName /*, value,... */) {
var args = Array.prototype.slice.call(arguments,1);
if($tw.utils.hop($tw.hooks.names,hookName)) {
$tw.hooks.invokeHook = function(hookName, firstArgument /*, value,... */) {
if(Object.prototype.hasOwnProperty.call($tw.hooks.names,hookName)) {
var args = Array.prototype.slice.call(arguments,1);
for(var i = 0; i < $tw.hooks.names[hookName].length; i++) {
args[0] = $tw.hooks.names[hookName][i].apply(null,args);
}
return args[0];
}
return args[0];
return firstArgument;
};
/////////////////////////// Main boot function to decrypt tiddlers and then startup
+1 -4
View File
@@ -3,8 +3,5 @@ name: en-GB
description: English (British)
author: JeremyRuston
core-version: >=5.0.0"
plugin-type: language
type: application/json
hidden: yes
{tidddlers:{}}
Stub pseudo-plugin for the default language
+3 -3
View File
@@ -4,12 +4,12 @@ _canonical_uri: The full URI of an external image tiddler
author: Name of the author of a plugin
bag: The name of the bag from which a tiddler came
caption: The text to be displayed on a tab or button
class: The CSS class applied to a tiddler when rendering it - see [[Custom styles by user-class]]. Also used for [[Modals]]
class: The CSS class applied to a tiddler when rendering it. Also used for Modals
code-body: The view template will display the tiddler as code if set to ''yes''
color: The CSS color value associated with a tiddler
component: The name of the component responsible for an [[alert tiddler|AlertMechanism]]
component: The name of the component responsible for an alert tiddler
core-version: For a plugin, indicates what version of TiddlyWiki with which it is compatible
current-tiddler: Used to cache the top tiddler in a [[history list|HistoryMechanism]]
current-tiddler: Used to cache the top tiddler in a history list
created: The date a tiddler was created
creator: The name of the person who created a tiddler
dependents: For a plugin, lists the dependent plugin titles
+2
View File
@@ -3,7 +3,9 @@ title: $:/language/Search/
DefaultResults/Caption: List
Filter/Caption: Filter
Filter/Hint: Search via a [[filter expression|https://tiddlywiki.com/static/Filters.html]]
Filter/Placeholder: Filter expression
Filter/Matches: //<small><<resultCount>> matches</small>//
Filter/FilterResults/Results/Caption: Results
Matches: //<small><<resultCount>> matches</small>//
Matches/All: All matches:
Matches/NoMatch: //No match//
+124 -66
View File
@@ -220,13 +220,25 @@ exports.filterTiddlers = function(filterString,widget,source) {
Compile a filter into a function with the signature fn(source,widget) where:
source: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)
widget: an optional widget node for retrieving the current tiddler etc.
Parameters:
filterString: the filter string to compile
options: includes:
wrappers: a hashmap of wrapper functions to apply to the compiled filter function
*/
exports.compileFilter = function(filterString) {
exports.compileFilter = function(filterString,options) {
options = options || {};
var self = this;
var wrappers = options.wrappers || {};
// Invoke the hook to allow the filter to be inspected
wrappers = $tw.hooks.invokeHook("th-filter-evaluation",filterString,wrappers) || wrappers;
// Get the result from the cache if we can
if(!this.filterCache) {
this.filterCache = Object.create(null);
this.filterCacheCount = 0;
}
if(this.filterCache[filterString] !== undefined) {
if(this.filterCache[filterString] !== undefined && !wrappers.prefix && !wrappers.operation && !wrappers.operator && !wrappers.start && !wrappers.done) {
return this.filterCache[filterString];
}
var filterParseTree;
@@ -235,7 +247,14 @@ exports.compileFilter = function(filterString) {
} catch(e) {
// We do not cache this result, so it adjusts along with localization changes
return function(source,widget) {
return [$tw.language.getString("Error/Filter") + ": " + e];
if(wrappers.start) {
wrappers.start(source,widget);
}
var resultsArray = [$tw.language.getString("Error/Filter") + ": " + e];
if(wrappers.done) {
wrappers.done(resultsArray);
}
return resultsArray;
};
}
// Get the hashmap of filter operator functions
@@ -249,52 +268,64 @@ exports.compileFilter = function(filterString) {
var operationSubFunction = function(source,widget) {
var accumulator = source,
results = [],
currTiddlerTitle = widget && widget.getVariable("currentTiddler");
$tw.utils.each(operation.operators,function(operator) {
var operands = [],
operatorFunction;
if(!operator.operator) {
// Use the "title" operator if no operator is specified
operatorFunction = filterOperators.title;
} else if(!filterOperators[operator.operator]) {
// Unknown operators treated as "[unknown]" - at run time we can distinguish between a custom operator and falling back to the default "field" operator
operatorFunction = filterOperators["[unknown]"];
} else {
// Use the operator function
operatorFunction = filterOperators[operator.operator];
}
$tw.utils.each(operator.operands,function(operand) {
if(operand.indirect) {
operand.value = self.getTextReference(operand.text,"",currTiddlerTitle);
} else if(operand.variable) {
var varTree = $tw.utils.parseFilterVariable(operand.text);
operand.value = widgetClass.evaluateVariable(widget,varTree.name,{params: varTree.params, source: source})[0] || "";
} else {
operand.value = operand.text;
}
operands.push(operand.value);
});
// Invoke the appropriate filteroperator module
results = operatorFunction(accumulator,{
operator: operator.operator,
operand: operands.length > 0 ? operands[0] : undefined,
operands: operands,
prefix: operator.prefix,
suffix: operator.suffix,
suffixes: operator.suffixes,
regexp: operator.regexp
},{
wiki: self,
widget: widget
currTiddlerTitle = widget && widget.getVariable("currentTiddler"),
handleOperation = function() {
$tw.utils.each(operation.operators,function(operator) {
var operands = [],
operatorName,operatorFunction;
if(!operator.operator) {
// Use the "title" operator if no operator is specified
operatorName = "title";
} else if(!filterOperators[operator.operator]) {
// Unknown operators treated as "[unknown]" - at run time we can distinguish between a custom operator and falling back to the default "field" operator
operatorName = "[unknown]";
} else {
// Use the operator function
operatorName = operator.operator;
}
operatorFunction = filterOperators[operatorName];
$tw.utils.each(operator.operands,function(operand) {
if(operand.indirect) {
operand.value = self.getTextReference(operand.text,"",currTiddlerTitle);
} else if(operand.variable) {
var varTree = $tw.utils.parseFilterVariable(operand.text);
operand.value = widgetClass.evaluateVariable(widget,varTree.name,{params: varTree.params, source: source})[0] || "";
} else {
operand.value = operand.text;
}
operands.push(operand.value);
});
if($tw.utils.isArray(results)) {
accumulator = self.makeTiddlerIterator(results);
} else {
accumulator = results;
}
});
if($tw.utils.isArray(results)) {
// Wrap the filter operator module if required
if(wrappers.operator) {
operatorFunction = wrappers.operator.bind(self,operatorFunction);
}
// Invoke the appropriate filteroperator module
results = operatorFunction(accumulator,{
parseTree: operator,
operator: operator.operator,
operatorName: operatorName,
operand: operands.length > 0 ? operands[0] : undefined,
operands: operands,
prefix: operator.prefix,
suffix: operator.suffix,
suffixes: operator.suffixes,
regexp: operator.regexp
},{
wiki: self,
widget: widget
});
if($tw.utils.isArray(results)) {
accumulator = self.makeTiddlerIterator(results);
} else {
accumulator = results;
}
});
};
if(wrappers.operation) {
handleOperation = wrappers.operation.bind(self,handleOperation,operation);
}
handleOperation();
if($tw.utils.isArray(results)) {
return results;
} else {
var resultArray = [];
@@ -307,27 +338,45 @@ exports.compileFilter = function(filterString) {
var filterRunPrefixes = self.getFilterRunPrefixes();
// Wrap the operator functions in a wrapper function that depends on the prefix
operationFunctions.push((function() {
var options = {wiki: self, suffixes: operation.suffixes || []};
var prefixName;
switch(operation.prefix || "") {
case "": // No prefix means that the operation is unioned into the result
return filterRunPrefixes["or"](operationSubFunction, options);
prefixName = "or";
break;
case "=": // The results of the operation are pushed into the result without deduplication
return filterRunPrefixes["all"](operationSubFunction, options);
prefixName = "all";
break;
case "-": // The results of this operation are removed from the main result
return filterRunPrefixes["except"](operationSubFunction, options);
prefixName = "except";
break;
case "+": // This operation is applied to the main results so far
return filterRunPrefixes["and"](operationSubFunction, options);
prefixName = "and";
break;
case "~": // This operation is unioned into the result only if the main result so far is empty
return filterRunPrefixes["else"](operationSubFunction, options);
default:
if(operation.namedPrefix && filterRunPrefixes[operation.namedPrefix]) {
return filterRunPrefixes[operation.namedPrefix](operationSubFunction, options);
} else {
return function(results,source,widget) {
results.clear();
results.push($tw.language.getString("Error/FilterRunPrefix"));
};
}
prefixName = "else";
break;
default:
prefixName = operation.namedPrefix;
break;
}
if(prefixName && filterRunPrefixes[prefixName]) {
var options = {
wiki: self,
suffixes: operation.suffixes || [],
prefixName: prefixName,
prefix: operation.prefix
},
filterRunPrefixFunction = filterRunPrefixes[prefixName];
// Wrap the filter operator module if required
if(wrappers.prefix) {
filterRunPrefixFunction = wrappers.prefix.bind(self,filterRunPrefixFunction);
}
return filterRunPrefixFunction(operationSubFunction,options);
} else {
return function(results,source,widget) {
results.clear();
results.push($tw.language.getString("Error/FilterRunPrefix"));
};
}
})());
});
@@ -341,6 +390,9 @@ exports.compileFilter = function(filterString) {
if(!widget) {
widget = $tw.rootWidget;
}
if(wrappers.start) {
wrappers.start(source,widget);
}
var results = new $tw.utils.LinkedList();
self.filterRecursionCount = (self.filterRecursionCount || 0) + 1;
if(self.filterRecursionCount < MAX_FILTER_DEPTH) {
@@ -351,7 +403,11 @@ exports.compileFilter = function(filterString) {
results.push("/**-- Excessive filter recursion --**/");
}
self.filterRecursionCount = self.filterRecursionCount - 1;
return results.toArray();
var resultsArray = results.toArray();
if(wrappers.done) {
wrappers.done(resultsArray);
}
return resultsArray;
});
if(this.filterCacheCount >= 2000) {
// To prevent memory leak, we maintain an upper limit for cache size.
@@ -360,7 +416,9 @@ exports.compileFilter = function(filterString) {
this.filterCache = Object.create(null);
this.filterCacheCount = 0;
}
this.filterCache[filterString] = fnMeasured;
this.filterCacheCount++;
if(!wrappers.prefix && !wrappers.operator) {
this.filterCache[filterString] = fnMeasured;
this.filterCacheCount++;
}
return fnMeasured;
};
-3
View File
@@ -6,7 +6,6 @@ module-type: filteroperator
Filter operator for returning all the backtranscludes from a tiddler
\*/
(function(){
"use strict";
/*
@@ -19,5 +18,3 @@ exports.backtranscludes = function(source,operator,options) {
});
return results.makeTiddlerIterator(options.wiki);
};
})();
-36
View File
@@ -1,36 +0,0 @@
/*\
title: $:/core/modules/filters/is/plugin.js
type: application/javascript
module-type: isfilteroperator
Filter function for [is[plugin]]
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter function
*/
exports.plugin = function(source,prefix,options) {
var results = [];
if(prefix === "!") {
source(function(tiddler,title) {
if(!tiddler.isPlugin()) {
results.push(title);
}
});
} else {
source(function(tiddler,title) {
if(tiddler.isPlugin()) {
results.push(title);
}
});
}
return results;
};
})();
-3
View File
@@ -6,7 +6,6 @@ module-type: filteroperator
Filter operator for returning all the transcludes from a tiddler
\*/
(function(){
"use strict";
/*
@@ -19,5 +18,3 @@ exports.transcludes = function(source,operator,options) {
});
return results.makeTiddlerIterator(options.wiki);
};
})();
@@ -10,7 +10,6 @@ This is a <%if [{something}] %>Elephant<%elseif [{else}] %>Pelican<%else%>Crocod
```
\*/
(function(){
"use strict";
exports.name = "conditional";
@@ -113,5 +112,3 @@ exports.parseIfClause = function(filterCondition) {
// Return the parse tree node
return [listWidget];
};
})();
+9 -39
View File
@@ -35,7 +35,6 @@ function PluginSwitcher(options) {
}
PluginSwitcher.prototype.switchPlugins = function() {
var self = this;
// Get the name of the current theme
var selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);
// If it doesn't exist, then fallback to one of the default themes
@@ -50,51 +49,22 @@ PluginSwitcher.prototype.switchPlugins = function() {
var tiddler = self.wiki.getTiddler(title);
if(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {
plugins.push(title);
var dependents = $tw.utils.parseStringArray(tiddler.fields.dependents || "");
var pluginInfo = $tw.utils.parseJSONSafe(self.wiki.getTiddlerText(title)),
dependents = $tw.utils.parseStringArray(tiddler.fields.dependents || "");
$tw.utils.each(dependents,function(title) {
accumulatePlugin(title);
});
}
};
accumulatePlugin(selectedPluginTitle);
var selectedPluginTiddler = this.wiki.getTiddler(selectedPluginTitle);
// Accumulate any other plugins of the same type with the same name
this.wiki.eachTiddlerPlusShadows(function(tiddler,title) {
if(tiddler.isPlugin() && tiddler.fields["plugin-type"] === self.pluginType && tiddler.fields.name === selectedPluginTiddler.fields.name) {
accumulatePlugin(title);
}
});
// Read the plugin info for the incoming plugins
var changedPluginInfo = this.wiki.readPluginInfo(plugins);
// Collect the shadow tiddlers of any deleted plugins
var changedShadowTiddlers = {};
$tw.utils.each(changedPluginInfo.deletedPlugins,function(pluginTitle) {
var contents = changedPluginInfo.deletedPluginContents[pluginTitle];
if(contents && contents.tiddlers) {
$tw.utils.each(Object.keys(contents.tiddlers),function(title) {
changedShadowTiddlers[title] = true;
});
}
});
// Collect the shadow tiddlers of any modified plugins
$tw.utils.each(changedPluginInfo.modifiedPlugins,function(pluginTitle) {
var pluginInfo = self.wiki.getPluginInfo(pluginTitle);
if(pluginInfo && pluginInfo.tiddlers) {
$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {
changedShadowTiddlers[title] = false;
});
}
});
// Unregister any existing theme/language tiddlers
var unregisteredTiddlers = this.wiki.unregisterPluginTiddlers(this.pluginType);
// Register any new theme/language tiddlers
var registeredTiddlers = this.wiki.registerPluginTiddlers(this.pluginType,plugins);
// Unpack the current theme/language tiddlers
this.wiki.unpackPluginTiddlers();
// Queue change events for the changed shadow tiddlers
$tw.utils.each(changedShadowTiddlers,function(status,title) {
self.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title], true);
});
var changes = $tw.wiki.readPluginInfo(plugins);
// Unregister any existing theme tiddlers
var unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);
// Register any new theme tiddlers
var registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);
// Unpack the current theme tiddlers
$tw.wiki.unpackPluginTiddlers();
// Call the switch handler
if(this.onSwitch) {
this.onSwitch(plugins);
+61 -1
View File
@@ -15,7 +15,67 @@ exports.after = ["load-modules"];
exports.before = ["startup"];
exports.synchronous = true;
var TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = "$:/status/RequireReloadDueToPluginChange";
var PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = "$:/config/RegisterPluginType/";
exports.startup = function() {
$tw.utils.installPluginChangeHandler($tw.wiki);
$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: "no"});
$tw.wiki.addEventListener("change",function(changes) {
// Work out which of the changed tiddlers are plugins that we need to reregister
var changesToProcess = [],
requireReloadDueToPluginChange = false;
$tw.utils.each(Object.keys(changes),function(title) {
var tiddler = $tw.wiki.getTiddler(title),
requiresReload = $tw.wiki.doesPluginRequireReload(title);
if(requiresReload) {
requireReloadDueToPluginChange = true;
} else if(tiddler) {
var pluginType = tiddler.fields["plugin-type"];
if($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields["plugin-type"] || ""),"no") === "yes") {
changesToProcess.push(title);
}
}
});
// Issue warning if any of the tiddlers require a reload
if(requireReloadDueToPluginChange) {
$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: "yes"});
}
// Read or delete the plugin info of the changed tiddlers
if(changesToProcess.length > 0) {
var changes = $tw.wiki.readPluginInfo(changesToProcess);
if(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) {
var changedShadowTiddlers = {};
// Collect the shadow tiddlers of any deleted plugins
$tw.utils.each(changes.deletedPlugins,function(pluginTitle) {
var pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);
if(pluginInfo) {
$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {
changedShadowTiddlers[title] = true;
});
}
});
// Collect the shadow tiddlers of any modified plugins
$tw.utils.each(changes.modifiedPlugins,function(pluginTitle) {
var pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);
if(pluginInfo && pluginInfo.tiddlers) {
$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {
changedShadowTiddlers[title] = false;
});
}
});
// (Re-)register any modified plugins
$tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins);
// Unregister any deleted plugins
$tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins);
// Unpack the shadow tiddlers
$tw.wiki.unpackPluginTiddlers();
// Queue change events for the changed shadow tiddlers
$tw.utils.each(Object.keys(changedShadowTiddlers),function(title) {
$tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title], true);
});
}
}
});
};
+4
View File
@@ -13,6 +13,10 @@ exports.hasTag = function(tag) {
return this.fields.tags && this.fields.tags.indexOf(tag) !== -1;
};
exports.isPlugin = function() {
return this.fields.type === "application/json" && this.hasField("plugin-type");
};
exports.isDraft = function() {
return this.hasField("draft.of");
};
-4
View File
@@ -6,8 +6,6 @@ module-type: utils
Custom errors for TiddlyWiki.
\*/
(function(){
function TranscludeRecursionError() {
Error.apply(this,arguments);
this.signatures = Object.create(null);
@@ -19,5 +17,3 @@ TranscludeRecursionError.MAX_WIDGET_TREE_DEPTH = 1000;
TranscludeRecursionError.prototype = Object.create(Error);
exports.TranscludeRecursionError = TranscludeRecursionError;
})();
-95
View File
@@ -1,95 +0,0 @@
/*\
title: $:/core/modules/utils/plugins.js
type: application/javascript
module-type: utils
Plugin utilities
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = "$:/status/RequireReloadDueToPluginChange";
var PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = "$:/config/RegisterPluginType/";
exports.installPluginChangeHandler = function(wiki) {
wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: "no"});
wiki.addEventListener("change",function(changes) {
// Work out which of the changed tiddlers are plugins that we need to (re)register
var changesToProcess = [];
$tw.utils.each(Object.keys(changes),function(title) {
var tiddler = wiki.getTiddler(title);
if(tiddler) {
// It is a plugin that has been added or modified and is of a type that we need to register
if(tiddler.isPlugin() && wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields["plugin-type"] || ""),"no") === "yes") {
changesToProcess.push(title);
}
} else {
if(wiki.isSubPlugin(title)) {
// It is a sub-plugin
changesToProcess.push(title);
} else {
// It is a plugin that has been deleted
var pluginInfo = wiki.getPluginInfo(title)
if(pluginInfo) {
changesToProcess.push(title);
}
}
}
});
if(changesToProcess.length > 0) {
// Read the plugin info of the changed tiddlers
var changedPluginInfo = wiki.readPluginInfo(changesToProcess);
if(changedPluginInfo.modifiedPlugins.length > 0 || changedPluginInfo.deletedPlugins.length > 0) {
var changedShadowTiddlers = {},
requireReloadDueToPluginChange = false;
// Collect the shadow tiddlers of any deleted plugins
$tw.utils.each(changedPluginInfo.deletedPlugins,function(pluginTitle) {
var contents = changedPluginInfo.deletedPluginContents[pluginTitle];
if(contents && contents.tiddlers) {
$tw.utils.each(Object.keys(contents.tiddlers),function(title) {
changedShadowTiddlers[title] = true;
if(contents.tiddlers[title].type === "application/javascript") {
requireReloadDueToPluginChange = true;
}
});
}
});
// Collect the shadow tiddlers of any modified plugins
$tw.utils.each(changedPluginInfo.modifiedPlugins,function(pluginTitle) {
var pluginInfo = wiki.getPluginInfo(pluginTitle);
if(pluginInfo && pluginInfo.tiddlers) {
$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {
changedShadowTiddlers[title] = false;
if(pluginInfo.tiddlers[title].type === "application/javascript") {
requireReloadDueToPluginChange = true;
}
});
}
});
// (Re-)register any modified plugins
wiki.registerPluginTiddlers(null,changedPluginInfo.modifiedPlugins);
// Unregister any deleted plugins
wiki.unregisterPluginTiddlers(null,changedPluginInfo.deletedPlugins);
// Unpack the shadow tiddlers
wiki.unpackPluginTiddlers();
// Queue change events for the changed shadow tiddlers
$tw.utils.each(changedShadowTiddlers,function(status,title) {
wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title], true);
});
// Issue warning if any of the tiddlers require a reload
if(requireReloadDueToPluginChange) {
wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: "yes"});
}
}
}
});
};
})();
-3
View File
@@ -6,7 +6,6 @@ module-type: utils
Utilities for working with the TiddlyWiki repository file structure
\*/
(function(){
"use strict";
/*
@@ -45,5 +44,3 @@ exports.getAllPlugins = function(options) {
$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,options.ignoreEnvironmentVariables ? undefined : $tw.config.languagesEnvVar),collectPlugins);
return tiddlers;
};
})();
-3
View File
@@ -6,7 +6,6 @@ module-type: widget
Widget to dynamically represent one or more tiddlers
\*/
(function(){
"use strict";
var Widget = require("$:/core/modules/widgets/widget.js").widget;
@@ -187,5 +186,3 @@ function hasPayloadChanged(a,b) {
}
exports.data = DataWidget;
})();
+1 -26
View File
@@ -6,7 +6,6 @@ module-type: widget
Widget to display a test case
\*/
(function(){
"use strict";
var Widget = require("$:/core/modules/widgets/widget.js").widget;
@@ -66,24 +65,11 @@ TestCaseWidget.prototype.render = function(parent,nextSibling) {
});
var jsonPayload = JSON.stringify(tiddlers);
this.testcaseWiki.addTiddlers(tiddlers);
// Suppress next tick dispatch for wiki change events
this.testcaseWiki.setDispatchMode(true);
// Unpack plugin tiddlers
this.testcaseWiki.readPluginInfo();
this.testcaseWiki.registerPluginTiddlers("plugin");
this.testcaseWiki.unpackPluginTiddlers();
this.testcaseWiki.addIndexersToWiki();
// Install the plugin change event handler
$tw.utils.installPluginChangeHandler(this.testcaseWiki);
// Install the language switcher
var languageSwitcher = new $tw.PluginSwitcher({
wiki: this.testcaseWiki,
pluginType: "language",
controllerTitle: "$:/language",
defaultPlugins: [
"$:/languages/en-GB"
]
});
// Generate a `transclusion` variable that depends on the values of the payload tiddlers so that the template can easily make unique state tiddlers
this.setVariable("transclusion",$tw.utils.hashString(jsonPayload));
// Generate a `payloadTiddlers` variable that contains the payload in JSON format
@@ -105,20 +91,13 @@ TestCaseWidget.prototype.render = function(parent,nextSibling) {
}
});
testcaseOutputWidget.render(testcaseOutputContainer);
// Install the wiki change event handler
this.testcaseWiki.addEventListener("change",function(changes) {
testcaseOutputWidget.refresh(changes,testcaseOutputContainer);
});
}
// Clear changes queue
this.testcaseWiki.clearTiddlerEventQueue();
// Run the actions if provided
if(this.testcaseWiki.tiddlerExists(this.testcaseTestActions)) {
testcaseOutputWidget.invokeActionString(this.testcaseWiki.getTiddlerText(this.testcaseTestActions));
// Make sure all wiki events have been cleared
while(this.testcaseWiki.eventsTriggered) {
this.testcaseWiki.processOutstandingTiddlerEvents();
}
testcaseOutputWidget.refresh(this.testcaseWiki.changedTiddlers,testcaseOutputContainer);
}
// Set up the test result variables
var testResult = "",
@@ -148,8 +127,6 @@ TestCaseWidget.prototype.render = function(parent,nextSibling) {
parentWidget: this
});
rootWidget.render(domNode);
// Re-enable next tick dispatch for wiki change events
this.testcaseWiki.setDispatchMode(false);
// Trap changes in the wiki and refresh the rendering
this.testcaseWiki.addEventListener("change",function(changes) {
rootWidget.refresh(changes,domNode);
@@ -182,5 +159,3 @@ TestCaseWidget.prototype.refresh = function(changedTiddlers) {
};
exports["testcase"] = TestCaseWidget;
})();
+12 -21
View File
@@ -132,14 +132,6 @@ exports.dispatchEvent = function(type /*, args */) {
}
};
/*
false (default) to dispatch event tick as usual
true to suppress dispatching the event tick and allow outstanding events to be processed manually
*/
exports.setDispatchMode = function(mode) {
this.dispatchMode = mode;
}
/*
Causes a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.
This method should be called after the changes it describes have been made to the wiki.tiddlers[] array.
@@ -164,18 +156,17 @@ exports.enqueueTiddlerEvent = function(title,isDeleted,isShadow) {
}
// Trigger events
this.eventListeners = this.eventListeners || {};
if(!this.eventsTriggered && !this.dispatchMode) {
$tw.utils.nextTick(this.processOutstandingTiddlerEvents.bind(this));
}
this.eventsTriggered = true;
};
exports.processOutstandingTiddlerEvents = function() {
var changes = this.changedTiddlers;
this.changedTiddlers = Object.create(null);
this.eventsTriggered = false;
if($tw.utils.count(changes) > 0) {
this.dispatchEvent("change",changes);
if(!this.eventsTriggered) {
var self = this;
$tw.utils.nextTick(function() {
var changes = self.changedTiddlers;
self.changedTiddlers = Object.create(null);
self.eventsTriggered = false;
if($tw.utils.count(changes) > 0) {
self.dispatchEvent("change",changes);
}
});
this.eventsTriggered = true;
}
};
@@ -1749,7 +1740,7 @@ exports.invokeUpgraders = function(titles,tiddlers) {
// Determine whether a plugin by title is dynamically loadable
exports.doesPluginRequireReload = function(title) {
var tiddler = this.getTiddler(title);
if(tiddler && tiddler.isPlugin()) {
if(tiddler && tiddler.fields.type === "application/json" && tiddler.fields["plugin-type"]) {
if(tiddler.fields["plugin-type"] === "import") {
// The import plugin never requires reloading
return false;
+22 -42
View File
@@ -34,39 +34,11 @@ caption: {{$:/language/Search/Filter/Caption}}
</$list>
\end
\procedure input-accept-actions()
\whitespace trim
<$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]">
<$list-empty>
<$list filter="[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]">
<$action-navigate $to={{{ [<tiddler>get[text]] }}}/>
</$list>
<$/list-empty>
<$action-navigate $to={{{ [<tiddler>get[text]] }}}/>
</$list>
\end
\procedure input-accept-variant-actions()
\whitespace trim
<$list filter="[{$:/config/Search/NavigateOnEnter/enable}match[yes]]">
<$list-empty>
<$list filter="[<tiddler>get[text]!is[missing]] :else[<tiddler>get[text]is[shadow]]">
<$list filter="[<__tiddler__>get[text]minlength[1]]">
<$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<tiddler>get[text]] }}}/>
</$list>
</$list>
</$list-empty>
<$list filter="[<tiddler>get[text]minlength[1]]">
<$action-sendmessage $message="tm-edit-tiddler" $param={{{ [<tiddler>get[text]] }}}/>
</$list>
</$list>
\end
\whitespace trim
<<lingo Filter/Hint>>
<div class="tc-search tc-advanced-search">
<div class="tc-search tc-advanced-search tc-edit-max-width">
<$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>> class="tc-small-gap-right">
<$keyboard key="((input-tab-left))" actions=<<set-previous-input-tab>>>
<$transclude $variable="keyboard-driven-input"
@@ -75,13 +47,16 @@ caption: {{$:/language/Search/Filter/Caption}}
refreshTitle="$:/temp/advancedsearch/refresh"
selectionStateTitle="$:/temp/advancedsearch/selected-item"
type="search"
tag="input"
tag="textarea"
focus={{$:/config/Search/AutoFocus}}
configTiddlerFilter="[[$:/temp/advancedsearch]]"
firstSearchFilterField="text"
inputAcceptActions=<<input-accept-actions>>
inputAcceptVariantActions=<<input-accept-variant-actions>>
inputAcceptActions=""
inputAcceptVariantActions=""
inputCancelActions=<<cancel-search-actions>>
minHeight="2em"
autoHeight="yes"
placeholder={{$:/language/Search/Filter/Placeholder}}
/>
</$keyboard>
</$keyboard>
@@ -90,13 +65,18 @@ caption: {{$:/language/Search/Filter/Caption}}
</$list>
</div>
<$reveal state="$:/temp/advancedsearch" type="nomatch" text="" tag="div" class="tc-search-results">
<$set name="resultCount" value="<$count filter={{$:/temp/advancedsearch}}/>">
<p><<lingo Filter/Matches>></p>
<$list filter={{$:/temp/advancedsearch}}>
<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] :and[then[]else[tc-list-item-selected]] }}}>
<$transclude tiddler="$:/core/ui/ListItemTemplate"/>
</span>
</$list>
</$set>
</$reveal>
<%if [{$:/temp/advancedsearch}trim[]!match[]] %>
<div class="tc-search-results">
<%if [all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterResults]!has[draft.of]count[]compare:number:gt[1]] %>
<$macrocall
$name="tabs"
tabsList="[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterResults]!has[draft.of]]"
default="$:/core/ui/AdvancedSearch/Filter/FilterResults/Results"
/>
<%else%>
<$list filter="[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterResults]!has[draft.of]]">
<$transclude/>
</$list>
<%endif%>
</div>
<%endif%>
@@ -0,0 +1,13 @@
title: $:/core/ui/AdvancedSearch/Filter/FilterResults/Results
tags: $:/tags/AdvancedSearch/FilterResults
caption: {{$:/language/Search/Filter/FilterResults/Results/Caption}}
\procedure lingo-base() $:/language/Search/
<$set name="resultCount" value="<$count filter={{$:/temp/advancedsearch}}/>">
<p><<lingo Filter/Matches>></p>
<$list filter={{$:/temp/advancedsearch}}>
<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] :and[then[]else[tc-list-item-selected]] }}}>
<$transclude tiddler="$:/core/ui/ListItemTemplate"/>
</span>
</$list>
</$set>
+1 -1
View File
@@ -37,7 +37,7 @@ caption: {{$:/language/Search/Standard/Caption}}
inputCancelActions=<<cancel-search-actions>>
inputAcceptActions=<<input-accept-actions>>
inputAcceptVariantActions=<<input-accept-variant-actions>>
configTiddlerFilter="[[$:/state/search/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}]"
configTiddlerFilter="[[$:/state/advancedsearch/standard/currentTab]!is[missing]get[text]] :else[{$:/config/SearchResults/Default}]"
filterMinLength={{$:/config/Search/MinLength}}/>
</$keyboard>
</$keyboard>
+1 -1
View File
@@ -8,7 +8,7 @@ caption: {{$:/language/ControlPanel/Plugins/Caption}}
\whitespace trim
<$set name="plugin-type" value="""$type$""">
<$set name="qualified-state" value=<<qualify "$:/state/plugin-info">>>
<$list filter="[all[tiddlers+shadows]!has[draft.of]plugin-type[$type$]!field:hidden[yes]sort[name]]" emptyMessage=<<lingo "Empty/Hint">> template="$:/core/ui/Components/plugin-info"/>
<$list filter="[!has[draft.of]plugin-type[$type$]sort[name]]" emptyMessage=<<lingo "Empty/Hint">> template="$:/core/ui/Components/plugin-info"/>
</$set>
</$set>
\end
@@ -1,5 +1,5 @@
title: $:/core/ui/ControlPanel/Plugins/Installed/Languages
tags: $:/tags/ControlPanel/Plugins
caption: {{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter="[all[tiddlers+shadows]is[plugin]!field:hidden[yes]plugin-type[language]]"/>)
caption: {{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter="[!has[draft.of]plugin-type[language]]"/>)
<<plugin-table language>>
@@ -1,5 +1,5 @@
title: $:/core/ui/ControlPanel/Plugins/Installed/Plugins
tags: $:/tags/ControlPanel/Plugins
caption: {{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter="[all[tiddlers+shadows]is[plugin]plugin-type[plugin]]"/>)
caption: {{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter="[!has[draft.of]plugin-type[plugin]]"/>)
<<plugin-table plugin>>
@@ -1,5 +1,5 @@
title: $:/core/ui/ControlPanel/Plugins/Installed/Themes
tags: $:/tags/ControlPanel/Plugins
caption: {{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter="[all[tiddlers+shadows]is[plugin]plugin-type[theme]]"/>)
caption: {{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter="[!has[draft.of]plugin-type[theme]]"/>)
<<plugin-table theme>>
+1 -1
View File
@@ -12,7 +12,7 @@ Export the TiddlyWiki core JavaScript code for running with external JavaScript:
tooltip="Export the TiddlyWiki core code for running with external JavaScript"
aria-label="export TiddlyWiki core"
class="tc-btn-big-green">
<$action-sendmessage $message='tm-download-file' $param='$:/core/templates/tiddlywiki5.js' filename=<<jsFileName>>/>
<$action-sendmessage $message='tm-download-file' $param='$:/core/templates/tiddlywiki5.js' filename=<<jsFileName>> type="application/javascript"/>
{{$:/core/images/download-button}}
<span class="tc-tiny-gap-left">
Download TiddlyWiki core
@@ -12,7 +12,7 @@ element, and right-click its `src` URI. Save the link as ''$(jsFileName)$''</p>
Export the ~TiddlyWiki core ~JavaScript code for running with external ~JavaScript:
<$button tooltip="Export the ~TiddlyWiki core code for running with external ~JavaScript" aria-label="export TiddlyWiki core" class="tc-btn-big-green">
<$list filter="[[$:/boot/boot.js]is[missing]]" variable="ignore" emptyMessage="""<$action-sendmessage $message="tm-download-file" $param="$:/core/templates/tiddlywiki5.js" filename=<<jsFileName>>/>""" >
<$list filter="[[$:/boot/boot.js]is[missing]]" variable="ignore" emptyMessage="""<$action-sendmessage $message="tm-download-file" $param="$:/core/templates/tiddlywiki5.js" filename=<<jsFileName>> type="application/javascript"/>""" >
<$action-setfield $tiddler=<<qualify "$:/temp/alert">> text=<<noExportMsg>> subtitle="Export ~TiddllyWiki Core"/>
<$action-sendmessage $message="tm-modal" $param=<<qualify "$:/temp/alert">>/>
</$list>
+1 -2
View File
@@ -103,8 +103,7 @@ code-body: yes
-Description
-Narrative
-[[$:/temp/testcase/draft-title]]
-[[$:/status/RequireReloadDueToPluginChange]]
-[[$:/core]]
-[has[plugin-type]]
-[prefix<tf.state>]
-[prefix[$:/state/popup/export]]
-[prefix[$:/HistoryList]]
+1 -1
View File
@@ -1,4 +1,4 @@
title: $:/core/ui/testcases/actions/Export
tags: $:/tags/TestCase/Actions
<$macrocall $name="exportButton" exportFilter="[all[tiddlers]sort[]] -[prefix[$:/state/]] -Description -Narrative -ExpectedResult -[[$:/core]]" lingoBase="$:/language/Buttons/ExportTiddlers/"/>
<$macrocall $name="exportButton" exportFilter="[all[tiddlers]sort[]] -[prefix[$:/state/]] -Description -Narrative -ExpectedResult -[has[plugin-type]]" lingoBase="$:/language/Buttons/ExportTiddlers/"/>
@@ -0,0 +1,4 @@
title: $:/coreURL
tags: $:/tags/Global
\function coreURL() [[../../../tiddlywikicore-$(version)$.js]substitute[]]
+4 -1
View File
@@ -11,6 +11,9 @@
],
"build": {
"index": [
"--rendertiddler","$:/core/save/all","classicparserdemo.html","text/plain"]
"--rendertiddler","$:/core/save/all","classicparserdemo.html","text/plain"],
"external": [
"--render","$:/core/save/all-external-js","classicparserdemo.html","text/plain"
]
}
}
@@ -0,0 +1,4 @@
title: $:/coreURL
tags: $:/tags/Global
\function coreURL() [[../../../tiddlywikicore-$(version)$.js]substitute[]]
+4 -1
View File
@@ -22,6 +22,9 @@
],
"build": {
"index": [
"--rendertiddler","$:/core/save/all","codemirrordemo.html","text/plain"]
"--rendertiddler","$:/core/save/all","codemirrordemo.html","text/plain"],
"external": [
"--render","$:/core/save/all-external-js","codemirrordemo.html","text/plain"
]
}
}
@@ -28,5 +28,4 @@ Note that JavaScript macros work on both the client and the server, and so do no
!! Macro Behaviour
Macros are just used to return a chunk of wikitext for further processing. They should not make modifications to tiddlers in the wiki store. The reason is that you cannott control when the macro is called; it may be called repeatedly as part of refresh processing. So it is important that macros do not have any other side effects beyond generating their text.
Macros are just used to return a chunk of wikitext for further processing. They should not make modifications to tiddlers in the wiki store. The reason is that you cannot control when the macro is called; it may be called repeatedly as part of refresh processing. So it is important that macros do not have any other side effects beyond generating their text.
@@ -34,13 +34,11 @@ Suppose we want to make a filter operator that returns every other tiddler from
We make a new tiddler, set its `type` and `module-type` appropriately, and begin writing the code:
```
(function(){
"use strict";
exports.everyother = function(source, operator, options) {
// TODO
}
})();
```
For the example filter syntax, our function will be called with
@@ -54,7 +52,6 @@ As is usually the case, we don't care about `operator.operator` here (since that
We could implement the operator by iterating over the input tiddlers and explicitly building a result array of titles:
```
(function(){
"use strict";
exports.everyother = function(source, operator, options) {
@@ -66,7 +63,6 @@ exports.everyother = function(source, operator, options) {
});
return result;
}
})();
```
That is, we supply a callback to `source` that negates `include` each time through (in order to grab every other result) and pushes the `title` of every other tiddler onto the result.
@@ -74,7 +70,6 @@ That is, we supply a callback to `source` that negates `include` each time throu
Alternatively, we can return our own iterator, by returning a function that accepts a similar callback and only calls it on every other tiddler:
```
(function(){
"use strict";
exports.everyother = function(source, operator, options) {
@@ -86,7 +81,6 @@ exports.everyother = function(source, operator, options) {
});
};
}
})();
```
Either way, we could interpret the `!` flag on the filter, if present, to mean that we want the //other// half of the tiddlers, by using it to set the initial value of `include`: `var include = operator.prefix !== "!";`
@@ -40,10 +40,7 @@ module-type: startup
YOUR DISCRCRIPTION COMES HERE!
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false, exports: true */
"use strict";
// Export name and synchronous status
@@ -63,6 +60,4 @@ exports.startup = function() {
});
};
})();
```
@@ -11,10 +11,7 @@ The wikitext parser subclassing mechanism makes it possible for custom parsers t
Here is an example of a subclass of the checkbox widget that adds logging to the event handler:
```js
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var WikiParser = require("$:/core/modules/parsers/wikiparser/wikiparser.js")["text/vnd.tiddlywiki"],
@@ -38,5 +35,4 @@ var MyCustomWikiParser = function(type,text,options) {
exports["text/vnd.my-custom-type"] = MyCustomWikiParser;
})();
```
@@ -26,10 +26,7 @@ module-type: widget-subclass
Widget base class
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.baseClass = "checkbox"; // Extend the <$checkbox> widget
@@ -50,5 +47,4 @@ exports.prototype.handleChangeEvent = function(event) {
console.log("Checkbox status:",this.inputDomNode.checked);
};
})();
```
@@ -0,0 +1,4 @@
title: $:/coreURL
tags: $:/tags/Global
\function coreURL() [[../../../tiddlywikicore-$(version)$.js]substitute[]]
+4 -1
View File
@@ -9,6 +9,9 @@
],
"build": {
"index": [
"--rendertiddler","$:/core/save/all","index.html","text/plain"]
"--rendertiddler","$:/core/save/all","index.html","text/plain"],
"external": [
"--render","$:/core/save/all-external-js","index.html","text/plain"
]
}
}
@@ -0,0 +1,4 @@
title: $:/coreURL
tags: $:/tags/Global
\function coreURL() [[../../../tiddlywikicore-$(version)$.js]substitute[]]
+3
View File
@@ -15,6 +15,9 @@
"build": {
"index": [
"--render","$:/core/save/all","index.html","text/plain"],
"external": [
"--render","$:/core/save/all-external-js","index.html","text/plain"
],
"favicon": [],
"static": [],
"empty": [],
@@ -0,0 +1,4 @@
title: $:/coreURL
tags: $:/tags/Global
\function coreURL() [[../../../tiddlywikicore-$(version)$.js]substitute[]]
+4 -1
View File
@@ -16,6 +16,9 @@
"--render","$:/core/templates/static.template.html","static.html","text/plain",
"--render","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain",
"--render","[!is[system]]","[encodeuricomponent[]addprefix[static/]addsuffix[.html]]","text/plain","$:/core/templates/static.tiddler.html",
"--render","$:/core/templates/static.template.css","static/static.css","text/plain"]
"--render","$:/core/templates/static.template.css","static/static.css","text/plain"],
"external": [
"--render","$:/core/save/all-external-js","highlightdemo.html","text/plain"
]
}
}
@@ -0,0 +1,4 @@
title: $:/coreURL
tags: $:/tags/Global
\function coreURL() [[../../../tiddlywikicore-$(version)$.js]substitute[]]
+3
View File
@@ -19,6 +19,9 @@
"--screenshot",
"[[$:/plugins/tiddlywiki/innerwiki/examples]]",
"4"
],
"external": [
"--render","$:/core/save/all-external-js","index.html","text/plain"
]
}
}
@@ -0,0 +1,4 @@
title: $:/coreURL
tags: $:/tags/Global
\function coreURL() [[../../../tiddlywikicore-$(version)$.js]substitute[]]
+4 -1
View File
@@ -16,6 +16,9 @@
"--render","$:/core/templates/static.template.html","static.html","text/plain",
"--render","$:/core/templates/alltiddlers.template.html","alltiddlers.html","text/plain",
"--render","[!is[system]]","[encodeuricomponent[]addprefix[static/]addsuffix[.html]]","text/plain","$:/core/templates/static.tiddler.html",
"--render","$:/core/templates/static.template.css","static/static.css","text/plain"]
"--render","$:/core/templates/static.template.css","static/static.css","text/plain"],
"external": [
"--render","$:/core/save/all-external-js","katexdemo.html","text/plain"
]
}
}
@@ -0,0 +1,4 @@
title: $:/coreURL
tags: $:/tags/Global
\function coreURL() [[../../../tiddlywikicore-$(version)$.js]substitute[]]
+4 -1
View File
@@ -13,6 +13,9 @@
],
"build": {
"index": [
"--rendertiddler","$:/core/save/all","markdowndemo.html","text/plain"]
"--rendertiddler","$:/core/save/all","markdowndemo.html","text/plain"],
"external": [
"--render","$:/core/save/all-external-js","markdowndemo.html","text/plain"
]
}
}
@@ -2,11 +2,8 @@ created: 20131127215321439
modified: 20140912135951542
title: $:/DefaultTiddlers
[[TiddlyWiki Pre-release]]
HelloThere
[[Quick Start]]
[[Find Out More]]
[[TiddlyWiki on the Web]]
[[Testimonials and Reviews]]
GettingStarted
Community
[[$:/plugins/tiddlywiki/internals]]
[[$:/AdvancedSearch]]
[[$:/plugins/tiddlywiki/internals/filterinspection/docs/inspectoperator]]
[[$:/plugins/tiddlywiki/internals/filterinspection/docs/InspectFilterMacro]]
[[$:/plugins/tiddlywiki/internals/filterinspection/docs/inspectfiltermacro/examples]]
@@ -1,36 +0,0 @@
title: Plugins/DynamicJSPluginLoad
description: Dynamic JS plugin loading
type: text/vnd.tiddlywiki-multiple
tags: [[$:/tags/wiki-test-spec]]
title: Output
{{$:/status/RequireReloadDueToPluginChange}}
+
title: Actions
<$action-createtiddler $basetitle="$:/plugins/tiddlywiki/test-js-plugin" $template="$:/plugins/tiddlywiki/test-js-plugin/raw" type="application/json"/>
+
title: $:/plugins/tiddlywiki/test-js-plugin/raw
list: readme
name: bundled-subplugin-tests
plugin-type: plugin
type: text/plain
{
"tiddlers": {
"$:/plugins/tiddlywiki/test-js-plugin/readme": {
"title": "$:/plugins/tiddlywiki/test-js-plugin/readme",
"text": "Readme from $:/plugins/tiddlywiki/test-js-plugin\n\n"
},
"$:/plugins/tiddlywiki/test-js-plugin/js": {
"title": "$:/plugins/tiddlywiki/test-js-plugin/js",
"text": "2+2",
"type": "application/javascript"
}
}
}
+
title: ExpectedResult
<p>yes</p>
@@ -1,47 +0,0 @@
title: Plugins/DynamicLoadLanguage
description: Dynamically loading of language plugin
type: text/vnd.tiddlywiki-multiple
tags: [[$:/tags/wiki-test-spec]]
title: Output
{{First}}
+
title: Actions
<$action-createtiddler $basetitle="$:/languages/fr-FR" $template="$:/languages/fr-FR/raw" type="application/json"/>
<$action-setfield $tiddler="$:/languages/fr-FR" plugin-type="language"/>
<$action-setfield $tiddler="$:/language" text="$:/languages/fr-FR"/>
+
title: $:/languages/en-GB
list: readme
name: en-GB
plugin-type: language
type: application/json
{
"tiddlers": {
"First": {
"title": "First",
"text": "This is English"
}
}
}
+
title: $:/languages/fr-FR/raw
list: readme
name: fr-FR
type: plain/text
{
"tiddlers": {
"First": {
"title": "First",
"text": "This is French"
}
}
}
+
title: ExpectedResult
<p>This is French</p>
@@ -1,46 +0,0 @@
title: Plugins/Language
description: Loading of correct language plugin at startup
type: text/vnd.tiddlywiki-multiple
tags: [[$:/tags/wiki-test-spec]]
title: Output
{{First}}
+
title: $:/language
$:/languages/fr-FR
+
title: $:/languages/en-GB
list: readme
name: en-GB
plugin-type: language
type: application/json
{
"tiddlers": {
"First": {
"title": "First",
"text": "This is English"
}
}
}
+
title: $:/languages/fr-FR
list: readme
name: fr-FR
plugin-type: language
type: application/json
{
"tiddlers": {
"First": {
"title": "First",
"text": "This is French"
}
}
}
+
title: ExpectedResult
<p>This is French</p>
@@ -1,57 +0,0 @@
title: Plugins/LanguageAddonSubPlugin
description: Loading of correct language subplugin at startup
type: text/vnd.tiddlywiki-multiple
tags: [[$:/tags/wiki-test-spec]]
title: Output
{{First}}
{{Second}}
+
title: $:/language
$:/languages/fr-FR-subplugin
+
title: $:/languages/fr-FR-container
list: readme
name: fr-FR
plugin-type: plugin
type: application/json
{
"tiddlers": {
"$:/languages/fr-FR-container/readme": {
"title": "$:/languages/fr-FR-container/readme",
"text": "Readme from ~$:/languages/fr-FR-container\n\n"
},
"$:/languages/fr-FR-subplugin": {
"title": "$:/languages/fr-FR-subplugin",
"name": "fr-FR",
"description": "fr-FR subplugin",
"list": "readme",
"stability": "STABILITY_1_EXPERIMENTAL",
"version": "5.3.7-prerelease",
"plugin-type": "language",
"dependents": "",
"type": "application/json",
"text": "{\"tiddlers\":{\"First\":{\"title\":\"First\",\"text\":\"First from ~$:/languages/fr-FR-subplugin\"}}}"
},
"$:/languages/fr-FR-subplugin2": {
"title": "$:/languages/fr-FR-subplugin2",
"name": "fr-FR",
"description": "fr-FR subplugin2",
"list": "readme",
"stability": "STABILITY_1_EXPERIMENTAL",
"version": "5.3.7-prerelease",
"plugin-type": "language",
"dependents": "",
"type": "application/json",
"text": "{\"tiddlers\":{\"Second\":{\"title\":\"Second\",\"text\":\"Second from ~$:/languages/fr-FR-subplugin2\"}}}"
}
}
}
+
title: ExpectedResult
<p>First from $:/languages/fr-FR-subplugin</p><p>Second from $:/languages/fr-FR-subplugin2</p>
@@ -1,45 +0,0 @@
title: Plugins/LanguageSubPlugin
description: Loading of correct language subplugin at startup
type: text/vnd.tiddlywiki-multiple
tags: [[$:/tags/wiki-test-spec]]
title: Output
{{First}}
{{$:/languages/fr-FR-container/readme}}
+
title: $:/language
$:/languages/fr-FR-subplugin
+
title: $:/languages/fr-FR-container
list: readme
name: fr-FR
plugin-type: plugin
type: application/json
{
"tiddlers": {
"$:/languages/fr-FR-container/readme": {
"title": "$:/languages/fr-FR-container/readme",
"text": "Readme from ~$:/languages/fr-FR-container\n\n"
},
"$:/languages/fr-FR-subplugin": {
"title": "$:/languages/fr-FR-subplugin",
"name": "fr-FR",
"description": "fr-FR subplugin",
"list": "readme",
"stability": "STABILITY_1_EXPERIMENTAL",
"version": "5.3.7-prerelease",
"plugin-type": "language",
"dependents": "",
"type": "application/json",
"text": "{\"tiddlers\":{\"First\":{\"title\":\"First\",\"text\":\"First from ~$:/languages/fr-FR-subplugin\"}}}"
}
}
}
+
title: ExpectedResult
<p>First from $:/languages/fr-FR-subplugin</p><p>Readme from $:/languages/fr-FR-container</p>
@@ -1,43 +0,0 @@
title: SubPlugins/DynamicSubPluginLoad
description: Dynamic sub-plugin loading
type: text/vnd.tiddlywiki-multiple
tags: [[$:/tags/wiki-test-spec]]
title: Output
{{$:/plugins/tiddlywiki/test-subplugin/readme}}
+
title: Actions
<$action-createtiddler $basetitle="$:/plugins/tiddlywiki/bundled-subplugin-tests" $template="$:/plugins/tiddlywiki/bundled-subplugin-tests/raw" type="application/json"/>
+
title: $:/plugins/tiddlywiki/bundled-subplugin-tests/raw
list: readme
name: bundled-subplugin-tests
plugin-type: plugin
type: text/plain
{
"tiddlers": {
"$:/plugins/tiddlywiki/bundled-subplugin-tests/readme": {
"title": "$:/plugins/tiddlywiki/bundled-subplugin-tests/readme",
"text": "Readme from $:/plugins/tiddlywiki/bundled-subplugin-tests\n\n"
},
"$:/plugins/tiddlywiki/test-subplugin": {
"title": "$:/plugins/tiddlywiki/test-subplugin",
"name": "test-subplugin",
"description": "Test subplugin",
"list": "readme",
"stability": "STABILITY_1_EXPERIMENTAL",
"version": "5.3.7-prerelease",
"plugin-type": "plugin",
"dependents": "",
"type": "application/json",
"text": "{\"tiddlers\":{\"$:/plugins/tiddlywiki/test-subplugin/readme\":{\"title\":\"$:/plugins/tiddlywiki/test-subplugin/readme\",\"text\":\"Readme from $:/plugins/tiddlywiki/test-subplugin\"},\"$:/plugins/tiddlywiki/test-subsubplugin\":{\"title\":\"$:/plugins/tiddlywiki/test-subsubplugin\",\"name\":\"test-subsubplugin\",\"description\":\"Test subsubplugin\",\"list\":\"readme readme2\",\"stability\":\"STABILITY_1_EXPERIMENTAL\",\"version\":\"5.3.7-prerelease\",\"plugin-type\":\"plugin\",\"dependents\":\"\",\"type\":\"application/json\",\"text\":\"{\\\"tiddlers\\\":{\\\"$:/plugins/tiddlywiki/test-subsubplugin/readme\\\":{\\\"title\\\":\\\"$:/plugins/tiddlywiki/test-subsubplugin/readme\\\",\\\"text\\\":\\\"Readme from $:/plugins/tiddlywiki/test-subsubplugin\\\"}}}\"}}}"
}
}
}
+
title: ExpectedResult
<p>Readme from <a class="tc-tiddlylink tc-tiddlylink-shadow" href="#%24%3A%2Fplugins%2Ftiddlywiki%2Ftest-subplugin">$:/plugins/tiddlywiki/test-subplugin</a></p>
@@ -1,47 +0,0 @@
title: SubPlugins/DynamicSubPluginUnload
description: Dynamic sub-plugin unloading
type: text/vnd.tiddlywiki-multiple
tags: [[$:/tags/wiki-test-spec]]
title: Output
<$transclude $tiddler="$:/plugins/tiddlywiki/test-subplugin/readme">
NO
</$transclude>
+
title: Actions
<$action-deletetiddler $tiddler="$:/plugins/tiddlywiki/bundled-subplugin-tests"/>
+
title: $:/plugins/tiddlywiki/bundled-subplugin-tests
list: readme
name: bundled-subplugin-tests
plugin-type: plugin
type: application/json
{
"tiddlers": {
"$:/plugins/tiddlywiki/bundled-subplugin-tests/readme": {
"title": "$:/plugins/tiddlywiki/bundled-subplugin-tests/readme",
"text": "Readme from $:/plugins/tiddlywiki/bundled-subplugin-tests\n\n"
},
"$:/plugins/tiddlywiki/test-subplugin": {
"title": "$:/plugins/tiddlywiki/test-subplugin",
"name": "test-subplugin",
"description": "Test subplugin",
"list": "readme",
"stability": "STABILITY_1_EXPERIMENTAL",
"version": "5.3.7-prerelease",
"plugin-type": "plugin",
"dependents": "",
"type": "application/json",
"text": "{\"tiddlers\":{\"$:/plugins/tiddlywiki/test-subplugin/readme\":{\"title\":\"$:/plugins/tiddlywiki/test-subplugin/readme\",\"text\":\"Readme from $:/plugins/tiddlywiki/test-subplugin\"},\"$:/plugins/tiddlywiki/test-subsubplugin\":{\"title\":\"$:/plugins/tiddlywiki/test-subsubplugin\",\"name\":\"test-subsubplugin\",\"description\":\"Test subsubplugin\",\"list\":\"readme readme2\",\"stability\":\"STABILITY_1_EXPERIMENTAL\",\"version\":\"5.3.7-prerelease\",\"plugin-type\":\"plugin\",\"dependents\":\"\",\"type\":\"application/json\",\"text\":\"{\\\"tiddlers\\\":{\\\"$:/plugins/tiddlywiki/test-subsubplugin/readme\\\":{\\\"title\\\":\\\"$:/plugins/tiddlywiki/test-subsubplugin/readme\\\",\\\"text\\\":\\\"Readme from $:/plugins/tiddlywiki/test-subsubplugin\\\"}}}\"}}}"
}
}
}
+
title: ExpectedResult
<p>
NO
</p>
@@ -1,21 +0,0 @@
title: SubPlugins/SimpleSubPlugin
description: Simple sub-plugin
type: text/vnd.tiddlywiki-multiple
tags: [[$:/tags/wiki-test-spec]]
title: Output
{{$:/plugins/tiddlywiki/test-subplugin/readme}}
+
title: $:/plugins/tiddlywiki/bundled-subplugin-tests
list: readme
name: bundled-subplugin-tests
plugin-type: plugin
type: application/json
{"tiddlers":{"$:/plugins/tiddlywiki/bundled-subplugin-tests/readme":{"title":"$:/plugins/tiddlywiki/bundled-subplugin-tests/readme","text":"Readme from $:/plugins/tiddlywiki/bundled-subplugin-tests\n\n"},"$:/plugins/tiddlywiki/test-subplugin":{"title":"$:/plugins/tiddlywiki/test-subplugin","name":"test-subplugin","description":"Test subplugin","list":"readme","stability":"STABILITY_1_EXPERIMENTAL","version":"5.3.7-prerelease","plugin-type":"plugin","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/plugins/tiddlywiki/test-subplugin/readme\":{\"title\":\"$:/plugins/tiddlywiki/test-subplugin/readme\",\"text\":\"Readme from $:/plugins/tiddlywiki/test-subplugin\"},\"$:/plugins/tiddlywiki/test-subsubplugin\":{\"title\":\"$:/plugins/tiddlywiki/test-subsubplugin\",\"name\":\"test-subsubplugin\",\"description\":\"Test subsubplugin\",\"list\":\"readme readme2\",\"stability\":\"STABILITY_1_EXPERIMENTAL\",\"version\":\"5.3.7-prerelease\",\"plugin-type\":\"plugin\",\"dependents\":\"\",\"type\":\"application/json\",\"text\":\"{\\\"tiddlers\\\":{\\\"$:/plugins/tiddlywiki/test-subsubplugin/readme\\\":{\\\"title\\\":\\\"$:/plugins/tiddlywiki/test-subsubplugin/readme\\\",\\\"text\\\":\\\"Readme from $:/plugins/tiddlywiki/test-subsubplugin\\\"}}}\"}}}"}}}
+
title: ExpectedResult
<p>Readme from <a class="tc-tiddlylink tc-tiddlylink-shadow" href="#%24%3A%2Fplugins%2Ftiddlywiki%2Ftest-subplugin">$:/plugins/tiddlywiki/test-subplugin</a></p>
@@ -6,12 +6,6 @@ tags: [[$:/tags/test-spec]]
Tests <$action-deletefield />.
\*/
(function(){
/* jslint node: true, browser: true */
/* eslint-env node, browser, jasmine */
/* eslint no-mixed-spaces-and-tabs: ["error", "smart-tabs"]*/
/* global $tw, require */
"use strict";
describe("<$action-deletefield /> tests", function() {
@@ -172,5 +166,3 @@ it("should correctly delete fields", function() {
});
});
})();
@@ -6,7 +6,6 @@ tags: [[$:/tags/test-spec]]
Tests the fakedom that Tiddlywiki occasionally uses.
\*/
(function(){
"use strict";
describe("fakedom tests", function() {
@@ -20,5 +19,3 @@ describe("fakedom tests", function() {
expect($tw.fakeDocument.createTextNode("text").TEXT_NODE).toBe(3);
});
});
})();
@@ -6,7 +6,6 @@ tags: [[$:/tags/test-spec]]
Tests for integrity of the core plugins, languages, themes and editions
\*/
(function(){
"use strict";
if($tw.node) {
@@ -47,6 +46,3 @@ if($tw.node) {
});
});
}
})();
@@ -3,10 +3,7 @@ title: test-widget-event.js
type: application/javascript
tags: [[$:/tags/test-spec]]
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
describe("Widget Event Listeners", function() {
@@ -220,5 +217,3 @@ describe("Widget Event Listeners", function() {
});
});
})();
@@ -6,7 +6,6 @@ tags: [[$:/tags/test-spec]]
Tests the wikitext rendering pipeline end-to-end. We also need tests that individually test parsers, rendertreenodes etc., but this gets us started.
\*/
(function(){
"use strict";
describe("Widget module", function() {
@@ -89,4 +88,3 @@ describe("Widget module", function() {
});
})();
+2 -1
View File
@@ -2,7 +2,8 @@
"description": "TiddlyWiki core tests",
"plugins": [
"tiddlywiki/jasmine",
"tiddlywiki/geospatial"
"tiddlywiki/geospatial",
"tiddlywiki/internals"
],
"themes": [
"tiddlywiki/vanilla",
@@ -0,0 +1,4 @@
title: $:/coreURL
tags: $:/tags/Global
\function coreURL() [[../../tiddlywikicore-$(version)$.js]substitute[]]
+3
View File
@@ -13,6 +13,9 @@
"build": {
"index": [
"--rendertiddler","$:/core/save/all","index.html","text/plain"
],
"external": [
"--render","$:/core/save/all-external-js","index.html","text/plain"
]
}
}
@@ -0,0 +1,4 @@
title: $:/coreURL
tags: $:/tags/Global
\function coreURL() [[tiddlywikicore-$(version)$.js]substitute[]]
@@ -0,0 +1,4 @@
title: $:/coreURL
tags: $:/tags/Global
\function coreURL() [[../../tiddlywikicore-$(version)$.js]substitute[]]
+4 -1
View File
@@ -10,6 +10,9 @@
],
"build": {
"index": [
"--render","$:/core/save/all","index.html","text/plain"]
"--render","$:/core/save/all","index.html","text/plain"],
"external": [
"--render","$:/core/save/all-external-js","index.html","text/plain"
]
}
}
+11
View File
@@ -0,0 +1,11 @@
created: 20250211092107689
modified: 20250211092307574
tags: Definitions
title: HTML Tags
type: text/vnd.tiddlywiki
<<<
In HTML, a tag is used for creating an element.
The name of an HTML element is the name that appears at the beginning of the element's start tag and at the end of the element's end tag (if the element has an end tag). For example, the p in the `<p>` start tag and `</p>` end tag is the name of the HTML paragraph element. Note that an element name in an end tag is preceded by a slash character: `</p>`, and that for void elements, the end tag is neither required nor allowed.
<<< https://developer.mozilla.org/en-US/docs/Glossary/Tag
@@ -1,6 +1,6 @@
breadcrumbs: [[Filter Step]]
created: 20140410103123179
modified: 20230410114132501
modified: 20250302200615061
tags: Filters
title: Filter Operators
type: text/vnd.tiddlywiki
@@ -21,7 +21,7 @@ type: text/vnd.tiddlywiki
A <<.def "filter operator">> is a predefined keyword attached to an individual step of a [[filter|Filters]]. It defines the particular action of that step.
''Important:'' In general, each first [[filter step|Filter Step]] of a [[filter run|Filter Run]] not given any input titles receives the output of <$link to="all Operator">[all[tiddlers]]</$link> as its input.
<<.tip """In general, each first [[filter step|Filter Step]] of a [[filter run|Filter Run]] not given any input titles receives the output of <$link to="all Operator">''[all[tiddlers]]''</$link> as its input.""" title:"Important">>
''Table legend:''
@@ -1,6 +1,6 @@
created: 20180111122953142
modified: 20181113084151268
tags: OfficialPlugins
tags: OfficialPlugins [[Plugin Editions]]
title: Dynaview Plugin
type: text/vnd.tiddlywiki
@@ -0,0 +1,17 @@
created: 20250302053159467
modified: 20250302053316068
tags: OfficialPlugins [[Plugin Editions]]
title: Geospatial Plugin
type: text/vnd.tiddlywiki
The Geospatial Plugin adds new primitives to the TiddlyWiki platform to enable non-developers to build sophisticated interactive geospatial applications.
It incorporates a number of third party libraries and online services:
* [[Leaflet.js|https://leafletjs.com/]], an open source library to display interactive maps
* [[Turf.js|https://turfjs.org/]], an open source library to perform geospatial calculations with [[GeoJSON|https://en.wikipedia.org/wiki/GeoJSON]] objects
* [[TravelTime|https://traveltime.com/]], a commercial API for [[geocoding|https://traveltime.com/features/geocoding]], [[routing|https://traveltime.com/features/multi-modal-routing]] and [[isochrones|https://traveltime.com/features/isochrones]]
* [[Flickr|https://www.flickr.com/services/api/]], a free API for retrieving geotagged photographs
* [[OpenLocationCode|https://github.com/google/open-location-code]], Google's open source library for converting to and from Open Location Codes (also known as [[PlusCodes|https://maps.google.com/pluscodes/]])
Try it out at https://tiddlywiki.com/plugins/tiddlywiki/geospatial/
@@ -1,6 +1,6 @@
created: 20190127104143725
modified: 20190127104143725
tags: OfficialPlugins
tags: OfficialPlugins [[Plugin Editions]]
title: Innerwiki Plugin
type: text/vnd.tiddlywiki
@@ -1,6 +1,6 @@
created: 20201228143125000
modified: 20201228143125000
tags: OfficialPlugins
modified: 20250302051857380
tags: OfficialPlugins [[Plugin Editions]]
title: Share Plugin
type: text/vnd.tiddlywiki
@@ -10,3 +10,5 @@ This experimental plugin provides tools to share tiddlers via URLs, comprising:
* The ability to load a group of tiddlers from the browser location hash at startup
* Wizard and templates to create URLs from group of tiddlers
See the demo at [ext[https://tiddlywiki.com/share|share]]
@@ -0,0 +1,9 @@
created: 20250302052635425
modified: 20250302052905312
tags: OfficialPlugins [[Plugin Editions]]
title: Tour Plugin
type: text/vnd.tiddlywiki
The tour plugin allows interactive learning tours to be created and presented in TiddlyWiki.
The demo TiddlyWiki interactive tour can be seen at https://tiddlywiki.com/tour
@@ -48,6 +48,6 @@ $caption$
<<special-button>>
""">>
<<.warning """If macros are nested, textual substitution will only occur for the outermost macro. Thi is because by the time the inner macros are processed all the substitutions will have already occurred""">>
<<.warning """If macros are nested, textual substitution will only occur for the outermost macro. This is because by the time the inner macros are processed all the substitutions will have already occurred""">>
A more formal [[presentation|Macro Definition Syntax]] of this syntax is also available.
@@ -14,13 +14,8 @@ Planned features include:
* Instantaneous synchronisation of changes between the server and all connected clients
* Workflow processing on the server, for example to automatically compress images, or to archive webpages
MWS does require basic knowledge of the command line and Node.js but is designed to be as simple as possible to setup and use. Once downloaded, just two commands are needed to complete the installation and start the server:
MWS does require basic knowledge of the command line and Node.js but is designed to be as simple as possible to setup and use. A few simple commands are all that is needed to complete the installation and start the server.
```
npm install
npm start
```
MWS is currently under development at ~GitHub but it is already functional and usable:
MWS is currently [[under development at GitHub|https://github.com/TiddlyWiki/TiddlyWiki5/pull/7915]] but it is already functional and usable. Visit the MWS website for more information:
! https://mws.tiddlywiki.com/
https://github.com/TiddlyWiki/MultiWikiServer/
@@ -3,10 +3,8 @@ modified: 20140912135951542
title: $:/DefaultTiddlers
type: text/vnd.tiddlywiki
HelloThere
[[Quick Start]]
[[Find Out More]]
[[TiddlyWiki on the Web]]
[[Testimonials and Reviews]]
GettingStarted
Community
[[$:/plugins/tiddlywiki/internals]]
[[$:/AdvancedSearch]]
[[$:/plugins/tiddlywiki/internals/filterinspection/docs/inspectoperator]]
[[$:/plugins/tiddlywiki/internals/filterinspection/docs/InspectFilterMacro]]
[[$:/plugins/tiddlywiki/internals/filterinspection/docs/inspectfiltermacro/examples]]
@@ -1,6 +1,6 @@
caption: action-setfield
created: 20141025120850184
modified: 20150806171403798
modified: 20250322010115457
tags: Widgets ActionWidgets
title: ActionSetFieldWidget
type: text/vnd.tiddlywiki
@@ -66,3 +66,10 @@ src='<$button>
<$action-navigate $to="$:/ControlPanel"/>
Go to Control Panel "Appearance" tab
</$button>'/>
Here is an example of a button that will update the value of an existing field in a tiddler
<$macrocall $name='wikitext-example-without-html'
src='<$button>
<$action-setfield $tiddler="Test" existing_field_name="new field value"/>
Update Field existing_field_name in tiddler Test
</$button>'/>
@@ -1,7 +1,7 @@
caption: reveal
created: 20131024141900000
jeremy: tiddlywiki
modified: 20240721175716320
modified: 20250211091937860
tags: Widgets
title: RevealWidget
type: text/vnd.tiddlywiki
@@ -28,7 +28,7 @@ The content of the `<$reveal>` widget is displayed according to the rules given
|stateTitle |A title containing the state, ''without'' TextReference. Gets preferred over the <<.attr state>> attribute |
|stateField |A ''field name'' which is used to look for the state, if the attribute <<.attr stateTitle>> is present |
|stateIndex |An ''index'' which is used to look for the state, if the attribute <<.attr stateTitle>> is present |
|tag |Overrides the default HTML element tag (`<div>` in block mode or `<span>` in inline mode) |
|tag |Overrides the default [[HTML Tags]] (`<div>` in block mode or `<span>` in inline mode) |
|type |The type of matching performed: ''match'', ''nomatch'', ''popup'', ''lt'', ''gt'', ''lteq'' or ''gteq'' |
|text |The text to match when the type is ''match'', ''nomatch'', ''lt'', ''gt'', ''lteq'' or ''gteq'' |
|class |An optional CSS class name to be assigned to the HTML element<br/>&raquo; Set to `tc-popup-keep` to make a popup "sticky", so it won't close when you click inside of it|
+1 -4
View File
@@ -7,9 +7,7 @@
"tiddlywiki/menubar",
"tiddlywiki/confetti",
"tiddlywiki/dynannotate",
"tiddlywiki/tour",
"tiddlywiki/codemirror",
"tiddlywiki/bundled-subplugin-tests"
"tiddlywiki/tour"
],
"themes": [
"tiddlywiki/vanilla",
@@ -23,7 +21,6 @@
"tiddlywiki/readonly"
],
"languages": [
"fr-FR"
],
"build": {
"index": [
@@ -0,0 +1,4 @@
title: $:/coreURL
tags: $:/tags/Global
\function coreURL() [[../../tiddlywikicore-$(version)$.js]substitute[]]
+4 -1
View File
@@ -12,6 +12,9 @@
],
"build": {
"index": [
"--rendertiddler","$:/core/save/all","index.html","text/plain"]
"--rendertiddler","$:/core/save/all","index.html","text/plain"],
"external": [
"--render","$:/core/save/all-external-js","index.html","text/plain"
]
}
}
+6
View File
@@ -609,3 +609,9 @@ J. Ryan Stinnett, @jryans, 2025/01/04
Galen Huntington, @galenhuntington, 2025/01/19
@Rhys-T, 2025/01/23
@Rumman157, 2025/03/17
@bob.jansen@cultconv.com, 2025/03/22
Matthew Salmon, @matthewsalmon, 2025/04/24
@@ -1,7 +0,0 @@
{
"title": "$:/plugins/tiddlywiki/bundled-subplugin-tests",
"name": "bundled-subplugin-tests",
"description": "Bundled subplugin tests",
"list": "readme",
"stability": "STABILITY_1_EXPERIMENTAL"
}
@@ -1,4 +0,0 @@
title: $:/plugins/tiddlywiki/bundled-subplugin-tests/readme
Readme from $:/plugins/tiddlywiki/bundled-subplugin-tests
@@ -1,7 +0,0 @@
{
"title": "$:/plugins/tiddlywiki/test-subplugin",
"name": "test-subplugin",
"description": "Test subplugin",
"list": "readme",
"stability": "STABILITY_1_EXPERIMENTAL"
}
@@ -1,3 +0,0 @@
title: $:/plugins/tiddlywiki/test-subplugin/readme
Readme from $:/plugins/tiddlywiki/test-subplugin
@@ -1,7 +0,0 @@
{
"title": "$:/plugins/tiddlywiki/test-subsubplugin",
"name": "test-subsubplugin",
"description": "Test subsubplugin",
"list": "readme readme2",
"stability": "STABILITY_1_EXPERIMENTAL"
}
@@ -1,3 +0,0 @@
title: $:/plugins/tiddlywiki/test-subsubplugin/readme
Readme from $:/plugins/tiddlywiki/test-subsubplugin
@@ -1,7 +0,0 @@
{
"title": "$:/language/codemirror/en-GB",
"name": "en-GB",
"plugin-type": "language",
"description": "English (UK) translations for CodeMirror",
"list": "readme"
}
@@ -1,3 +0,0 @@
title: $:/language/codemirror/en-GB/readme
English (UK) translations for CodeMirror
@@ -1,29 +0,0 @@
title: $:/language/codemirror/
homeUrl: http://codemirror.net
addOnUrl: http://codemirror.net/doc/manual.html#addons
configUrl: http://codemirror.net/doc/manual.html#config
controlPanel/hint: Tʜᴇꜱᴇ ꜱᴇᴛᴛɪɴɢꜱ ʟᴇᴛ ʏᴏᴜ ᴄᴜꜱᴛᴏᴍɪꜱᴇ ᴛʜᴇ ʙᴇʜᴀᴠɪᴏᴜʀ ᴏꜰ [[CᴏᴅᴇMɪʀʀᴏʀ|$:/plugins/tiddlywiki/codemirror]].
controlPanel/keyboard: Kᴇʏʙᴏᴀʀᴅ ꜱʜᴏʀᴛᴄᴜᴛꜱ
controlPanel/usage: Uꜱᴀɢᴇ ɪɴꜰᴏʀᴍᴀᴛɪᴏɴ
cursorBlinkRate/hint: Cᴜʀꜱᴏʀ ʙʟɪɴᴋ ʀᴀᴛᴇ
editorFont/hint: Eᴅɪᴛᴏʀ ꜰᴏɴᴛ ꜰᴀᴍɪʟʏ
editorFont/info: Sᴇᴛ ᴛʜᴇ ꜰᴏɴᴛ ꜰᴀᴍɪʟʏ ꜰᴏʀ ᴛʜᴇ ~CᴏᴅᴇMɪʀʀᴏʀ ᴛᴇxᴛ-ᴇᴅɪᴛᴏʀ
indentUnit/hint: Hᴏᴡ ᴍᴀɴʏ ꜱᴘᴀᴄᴇꜱ ᴀ ʙʟᴏᴄᴋ ꜱʜᴏᴜʟᴅ ʙᴇ ɪɴᴅᴇɴᴛᴇᴅ
indentWithTabs/hint: Eɴᴀʙʟᴇ ɪɴᴅᴇɴᴛɪɴɢ ᴡɪᴛʜ ᴛᴀʙꜱ
indentWithTabs/info: Wʜᴇᴛʜᴇʀ, ᴡʜᴇɴ ɪɴᴅᴇɴᴛɪɴɢ, ᴛʜᴇ ꜰɪʀꜱᴛ N*`ᴛᴀʙSɪᴢᴇ` ꜱᴘᴀᴄᴇꜱ ꜱʜᴏᴜʟᴅ ʙᴇ ʀᴇᴘʟᴀᴄᴇᴅ ʙʏ N ᴛᴀʙꜱ.
keyMap/hint: ~CᴏᴅᴇMɪʀʀᴏʀ ᴋᴇʏᴍᴀᴘ
keyMap/info: ~Tʜᴇ Kᴇʏʙᴏᴀʀᴅ KᴇʏMᴀᴘ ᴜꜱᴇᴅ ᴡɪᴛʜɪɴ ᴛʜᴇ ~CᴏᴅᴇMɪʀʀᴏʀ ᴛᴇxᴛ-ᴇᴅɪᴛᴏʀ
lineNumbers/hint: Eɴᴀʙʟᴇ ʟɪɴᴇ ɴᴜᴍʙᴇʀꜱ
lineNumbers/info: Wʜᴇᴛʜᴇʀ ᴛᴏ ꜱʜᴏᴡ ʟɪɴᴇ ɴᴜᴍʙᴇʀꜱ ᴛᴏ ᴛʜᴇ ʟᴇꜰᴛ ᴏꜰ ᴛʜᴇ ᴇᴅɪᴛᴏʀ.
lineWrapping/hint: Eɴᴀʙʟᴇ ʟɪɴᴇ ᴡʀᴀᴘᴘɪɴɢ
lineWrapping/info: Wʜᴇᴛʜᴇʀ CᴏᴅᴇMɪʀʀᴏʀ ꜱʜᴏᴜʟᴅ ꜱᴄʀᴏʟʟ ᴏʀ ᴡʀᴀᴘ ꜰᴏʀ ʟᴏɴɢ ʟɪɴᴇꜱ. Dᴇꜰᴀᴜʟᴛꜱ ᴛᴏ `ꜰᴀʟꜱᴇ` (ꜱᴄʀᴏʟʟ).
showCursorWhenSelecting/hint: Sʜᴏᴡ ᴄᴜʀꜱᴏʀ, ᴡʜᴇɴ ꜱᴇʟᴇᴄᴛɪɴɢ
showCursorWhenSelecting/info: Wʜᴇᴛʜᴇʀ ᴛʜᴇ ᴄᴜʀꜱᴏʀ ꜱʜᴏᴜʟᴅ ʙᴇ ᴅʀᴀᴡɴ ᴡʜᴇɴ ᴀ ꜱᴇʟᴇᴄᴛɪᴏɴ ɪꜱ ᴀᴄᴛɪᴠᴇ.
smartIndent/hint: Eɴᴀʙʟᴇ ꜱᴍᴀʀᴛ ɪɴᴅᴇɴᴛ
smartIndent/info: Wʜᴇᴛʜᴇʀ ᴛᴏ ᴜꜱᴇ ᴛʜᴇ ᴄᴏɴᴛᴇxᴛ-ꜱᴇɴꜱɪᴛɪᴠᴇ ɪɴᴅᴇɴᴛᴀᴛɪᴏɴ ᴛʜᴀᴛ ᴛʜᴇ ᴍᴏᴅᴇ ᴘʀᴏᴠɪᴅᴇꜱ (ᴏʀ ᴊᴜꜱᴛ ɪɴᴅᴇɴᴛ ᴛʜᴇ ꜱᴀᴍᴇ ᴀꜱ ᴛʜᴇ ʟɪɴᴇ ʙᴇꜰᴏʀᴇ). Dᴇꜰᴀᴜʟᴛꜱ ᴛᴏ `ᴛʀᴜᴇ`.
styleActiveLine/hint: Hɪɢʜʟɪɢʜᴛ ᴀᴄᴛɪᴠᴇ ʟɪɴᴇ
styleActiveLine/info: Wʜᴇᴛʜᴇʀ ᴏʀ ɴᴏᴛ ᴛᴏ ʜɪɢʜʟɪɢʜᴛ ᴛʜᴇ ᴀᴄᴛɪᴠᴇ ᴛᴇxᴛ-ᴇᴅɪᴛᴏʀ ʟɪɴᴇ
tabSize/hint: Wɪᴅᴛʜ ᴏꜰ ᴀ ᴛᴀʙ ᴄʜᴀʀᴀᴄᴛᴇʀ
theme/hint: Sᴇʟᴇᴄᴛ ᴀ ᴛʜᴇᴍᴇ
theme/info: Cʜᴏᴏꜱᴇ ʙᴇᴛᴡᴇᴇɴ ~CᴏᴅᴇMɪʀʀᴏʀ ᴛʜᴇᴍᴇꜱ
@@ -1,7 +0,0 @@
{
"title": "$:/language/codemirror/fr-FR",
"name": "fr-FR",
"plugin-type": "language",
"description": "French translations for CodeMirror",
"list": "readme"
}
@@ -1,3 +0,0 @@
title: $:/language/codemirror/fr-FR/readme
French translations for CodeMirror

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