1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2026-01-23 11:24:40 +00:00

Compare commits

..

75 Commits

Author SHA1 Message Date
Jeremy Ruston
c05400021c Merge branch 'master' into intrinsic-sub-plugins 2025-03-21 17:24:56 +00:00
Mario Pietsch
8aa558eb2c Remove module function wrapper and add matching configurations for dprint and eslint (#7596)
* remove blks first try

* dprint.json seems to be OK, some forgotten functions

* add some more space-after-keyword settings

* server remove blks

* add **/files to dprint exclude

* dprint.js fixes a typo

* add boot.js and bootprefix.js to dprint exclude

* dprint change dprint.json

* add dprint fmt as script

* remove jslint comments

* fix whitespace

* fix whitespace

* remove function-wrapper from geospatial plugin

* fix whitespace

* add function wrapper to dyannotate-startup

* remove dpring.json
2025-03-21 17:22:57 +00:00
lin onetwo
819d84ecab Add removeEventListener, and allow register multiple listeners (#8978)
* feat: add removeEventListener , and allow register multiple listeners

Instead of remove old one when add new one.

* refactor: simplify the logic, similar to wiki class's addEventListener

* feat: prevent adding the same event listener multiple times
2025-03-21 15:51:13 +00:00
Jeremy Ruston
55dbce10f4 Fix crash loading large files
Attempts to load large files are neutered with a warning message

Is 100MB the right limit?
2025-03-21 14:48:01 +00:00
Leilei332
0b3efc2771 Fix overflow in Browser Storage settings page (#8752)
Only a small fix
2025-03-21 13:35:26 +00:00
Leilei332
06adaf3331 Update zh-Hans translation (#8974) 2025-03-11 12:33:14 +00:00
Jeremy Ruston
c3695765ad Move execution of startup actions after initialisation of the language switcher (#8950)
Fixes #8946
2025-03-06 21:29:21 +00:00
Cameron Fischer
636dae6c58 Fixed RSoD error with moduleproperty filter operator (#8958)
* Fixed RSoD error with moduleproperty filter operator

* No RSoD when getting non-string objects as well
2025-03-06 21:28:39 +00:00
Jeremy Ruston
c25d6c11da Update release note 2025-03-06 21:20:37 +00:00
Mario Pietsch
4822919aa4 fix .median sort function (#8971) 2025-03-03 17:11:16 +00:00
Cameron Fischer
0dda07e3f1 Fix for #5930: missing tiddlers with checkbox indexes (#8964) 2025-02-27 18:02:43 +00:00
Jeremy Ruston
5111be1953 Merge branch 'master' into intrinsic-sub-plugins 2025-02-27 17:36:41 +00:00
Jeremy Ruston
9dadd3fafb Display subplugins in control panel listing 2025-02-27 16:54:32 +00:00
Jeremy Ruston
12ced06d1d Add subplugins for codemirror languages
The French translation is just for demo purposes. It would be helpful to replace it with some real translations.
2025-02-27 12:49:24 +00:00
Jeremy Ruston
a4e8308e75 Add comment 2025-02-27 12:48:07 +00:00
Jeremy Ruston
9a2534fc5e Fix accidentally disabled test 2025-02-27 11:17:35 +00:00
Jeremy Ruston
2ae1e5aa09 Merge branch 'tiddlywiki-com' 2025-02-27 11:01:28 +00:00
Leilei332
378b9b3627 Allow building external core version of main site (#8953) 2025-02-27 11:00:58 +00:00
Jeremy Ruston
e01c428a17 Add support for add-on language and theme plugins 2025-02-26 21:17:53 +00:00
Jeremy Ruston
752c5cfbda Cleaning up 2025-02-26 20:01:32 +00:00
Jeremy Ruston
094428b1ab Remove debug code 2025-02-26 18:07:39 +00:00
Jeremy Ruston
41cd335cf4 Add test for dynamically loading a language plugin 2025-02-26 17:20:03 +00:00
Jeremy Ruston
26b2768294 Fix testcase export to include plugins 2025-02-26 17:18:37 +00:00
Mario Pietsch
0f79f88f58 Fix problem toc-selective-expandable (#8959)
fix problem toc-selective-expandable
2025-02-24 20:49:48 +00:00
Jeremy Ruston
4e3d07b16a Code typo 2025-02-22 10:19:57 +00:00
Jeremy Ruston
01beac1d7c Test for loading language plugins at startup 2025-02-21 16:47:00 +00:00
Leilei332
2cb5f57c69 Remove flags in language plugins (#8837)
* Remove flags in language plugins

* Remove references to language icons

* Remove obsolete example

There are no incoming links to this tiddler

* Remove icon from en-GB language

* Temporarily add all the languages for testing

To be removed before merging

* Add new "language" icon

* Languageswitcher update

* Translator editon docs update

* Fixes for introduction edition

* Remove LanguageGallery in ja-JP edition

* Remove temporary setting

---------

Co-authored-by: Jeremy Ruston <jeremy@jermolene.com>
2025-02-21 12:17:53 +00:00
Jeremy Ruston
0c80e1b35c Move subplugin tests into their own folder 2025-02-21 10:59:38 +00:00
Jeremy Ruston
55c634692b Deal with dynamic loading and unloading of plugins
More enhancements needed for the test framework too in order to allow events to be processed manually, without relying on the nexttick handler which is awkward in Jasmine
2025-02-21 09:36:40 +00:00
Jeremy Ruston
7e2a8238b5 Clarify comment 2025-02-18 21:17:34 +00:00
Jeremy Ruston
ee90ad2fa6 Merge branch 'master' into intrinsic-sub-plugins 2025-02-18 21:15:39 +00:00
Jeremy Ruston
d3f441cbb5 Unpack plugins for wiki based tests 2025-02-18 21:15:01 +00:00
Jeremy Ruston
afabe5b714 More efficient checks if a tiddler is a plugin 2025-02-18 17:30:11 +00:00
Jeremy Ruston
3a60e0eb17 Merge branch 'master' into intrinsic-sub-plugins 2025-02-18 16:54:47 +00:00
Jeremy Ruston
361a9668a2 Merge branch 'tiddlywiki-com' 2025-02-18 11:53:00 +00:00
Jeremy Ruston
b0d950faec Delete references to TiddlyWiki's Twitter account 2025-02-18 11:52:47 +00:00
Mario Pietsch
8a92c4632d [DOCS] Make it more obvious that $:/DefaultTiddlers setting can handle filter-expressions (#8729)
* [DOCS] Make it more obvious that $:/DefaultTiddlers setting can handle filter-expressions

* update with requested changes.

* [DOCS] Make it more obvious that $:/DefaultTiddlers setting can handle filter-expressions

* Refactor text according to feedback

* Create link to DefaultTiddlers system tiddler
2025-02-18 10:43:21 +00:00
Mario Pietsch
a1053ddc3d list-tagged-draggable shows caption field if it is available (#8721) 2025-02-18 10:31:08 +00:00
Jeremy Ruston
6b0a13b8cc Basic loading of bundled subplugins
Very basic. Doesn't cope with any changes to the plugins after startup, and doesn't remove sub-plugins when the parent plugin is removed.
2025-02-18 09:14:54 +00:00
Jeremy Ruston
c142bfc50d Use "bundled" rather than "intrinsic" 2025-02-18 09:14:05 +00:00
Mario Pietsch
7ea788ca83 fix page save button wikify update problem (#8956) 2025-02-18 09:06:14 +00:00
Jeremy Ruston
e8de413fba More refactoring for clarity 2025-02-17 16:31:42 +00:00
Mario Pietsch
614ba8432f [DOCS] Improve External Images Docs (#8954) 2025-02-17 16:13:38 +00:00
Jeremy Ruston
4cbf1b4d91 Refactor some symbols for clarity
All these symbols are inaccessible outside the wiki class closure, and so no backwards compatibility issues
2025-02-16 19:32:56 +00:00
Jeremy Ruston
778e544f1c Initial Commit 2025-02-16 18:20:00 +00:00
Leilei332
c84de85ed2 Add system-ui to default font family (#8951)
* Add system-ui to default font family

* Make system-ui's priority lower
2025-02-15 11:11:49 +00:00
Mario Pietsch
cd89415461 [DOCS] Fix duplicate link in: HTML in Wikitext (#8944)
* [DOCS] Fix duplicate link in: HTML in Wikitext

* Update HTML in WikiText.tid
2025-02-14 19:37:54 +00:00
Leilei332
fbe5a2f908 Fix incorrect downloaded file extension (#8928)
* Fix incorrect downloaded file extension

* Update docs
2025-02-14 18:17:00 +00:00
j. redhead
ae9623ab2d Correct noscript fallback for Empty Edition (#8924)
* Correct noscript fallback for Empty Edition

Also slightly improve the Mastodon link text (since it'll be read by people without JS)

Before this patch, if the "built-in" Empty Edition was downloaded then the Mastodon verification link was included, which is wrong.
Not a super big deal since it'll get "flushed out" the first time the user saves, but still confusing.

The mastodon link could've just been moved inside the <$reveal>
but I think it's better to try to achieve parity with tiddlywiki.com/empty.html; 
This commit does not achieve parity but it gets us closer.

* Remove whitespace from conditional shortcut syntax

Conform to style used in #8583 as suggested by https://github.com/TiddlyWiki/TiddlyWiki5/pull/8924/files#r1938181043
2025-02-14 18:02:38 +00:00
Mario Pietsch
2a2d998bef fix contains operator RSOD if created field is accessed (#8931) 2025-02-14 17:58:33 +00:00
Mario Pietsch
867fad030e fix page toolbar more dropdown inconsistent whitespace (#8932) 2025-02-14 17:57:42 +00:00
Cameron Fischer
4425a891bc Addresses #7836: Noisy $fill widgets (#8930)
$fill widgets will get ignored when encountered by ts-raw slots
2025-02-14 17:57:06 +00:00
Mario Pietsch
0ac2b6ce31 [DOCS] Fix link to external blog post about TW (#8934)
* [DOCS] Fix link to external blog post about TW

* Update Future Proof.tid
2025-02-14 17:54:54 +00:00
Mario Pietsch
697171a30d [DOCS] HelloThere. Add info about the core nature of TW as a web-app (#8935)
* [DOCS] HelloThere. Add info about the core nature of TW as a web-app

* Update HelloThere.tid
2025-02-14 17:53:12 +00:00
IchijikuIchigo
0b758190d1 [ja_JP] Japanese translation update - 'Platforms' section of tiddlywiki.com (#8940)
* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\definitions\TiddlyDesktop.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\platforms\Platforms.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\nodejs\TiddlyWiki on Node.js.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\nodejs\Building TiddlyWikiClassic.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\nodejs\Installing TiddlyWiki Prerelease on Node.js.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\commands\NamedCommandParameters.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\nodejs\Upgrading TiddlyWiki on Node.js.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\howtos\Using a custom path prefix with the client-server edition.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\nodejs\Customising Tiddler File Naming.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\nodejs\Environment Variables on Node.js.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\howtos\Generating Static Sites with TiddlyWiki.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\howtos\How to build a TiddlyWiki5 from individual tiddlers.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\nodejs\Installing custom plugins on Node.js.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\nodejs\Installing official plugins on Node.js.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\saving\Example config-tiddlyweb-host for IIS.txt'

* [ja-JP] Japanese translation of 'editions\ja-JP\tiddlers\saving\Example package.json for IIS.txt'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\saving\Example tiddlywiki.info for IIS.txt'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\saving\Example web.config for IIS.txt'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\fileformats\MultiTiddlerFiles.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\fileformats\MultiTiddlerFileSyntax.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\nodejs\Scripts for TiddlyWiki on Node.js.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\fileformats\TiddlerFiles.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\nodejs\tiddlywiki.files_Files.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\nodejs\tiddlywiki.info_Files.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\concepts\TiddlyWikiFolders.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\nodejs\Uninstalling a plugin with Node.js.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\howtos\Using TiddlyWiki for GitHub project documentation.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\nodejs\Using TiddlyWiki on Node.js.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\nodejs\Working with the TiddlyWiki5 repository.tid'

* [ja-JP] Japanese translation of 'editions\tw5.com\tiddlers\plugins\Plugin Ordering.tid'
2025-02-14 17:39:49 +00:00
Mario Pietsch
4f0bdac77b [DOCS] Improve documentation about TW Concepts (#8942) 2025-02-14 17:27:24 +00:00
Jeremy Ruston
3051e8dddc Don't show draft palettes in the switcher 2025-02-14 16:44:51 +00:00
Mario Pietsch
f5a6ac9446 [DOCS] Crosslink, then / else Operators, :then / :else Fiter Run Prefixes (#8949)
* [DOCS] Crosslink, then / else Operators, :then / :else Fiter Run Prefixes

* Update else Operator.tid

* Update Else Filter Run Prefix.tid

* Update then Filter Run Prefix.tid

* Update then Operator.tid
2025-02-14 14:46:39 +00:00
Jeremy Ruston
2ebf452abb Consent banner should not display in static renderings 2025-02-09 14:29:43 +00:00
Jeremy Ruston
d4bc3fcd99 Fix: HTTP progress handler not passed optional variables
Thanks @ericshulman
2025-02-06 17:04:10 +00:00
Jeremy Ruston
d770d98aff Refactor user defined function operator to make debugging easier 2025-02-03 13:27:02 +00:00
Leilei332
f7043f6d43 Fix 8915 (#8916) 2025-01-28 12:48:24 +00:00
Leilei332
76f40208af Flexoki palette update (#8909)
* Flexoki palette update

* Improve highlight contrast
2025-01-27 18:10:04 +00:00
Leilei332
67e8670c73 Extend copy to clipborad function to support customized mime types (#8912)
* Extend copy to clipborad function to support customized mime types

* Remove function default parameter syntax

* Add plainText option

* Use plainText name

* Set "text/plain" data only when it exists

* Docs update

* Docs update
2025-01-27 16:45:26 +00:00
Saq Imtiaz
b1843837ea Fixes unnecessary refresh in Genesis widget (#8895)
* fix: handle attributes correctly in genesis widget

* fix: handle attributes correctly in genesis widget
2025-01-27 11:00:26 +00:00
Saq Imtiaz
42c22acba6 Cleans up cruft from edit widget (#8897)
* chore: cleanup cruft from edit widget

* chore: cleanup cruft from edit widget

* chore: cleanup cruft from edit widget
2025-01-27 11:00:07 +00:00
Saq Imtiaz
f02c9ebba3 feat: support for avif images (#8911) 2025-01-26 12:25:01 +00:00
Rhys-T
94b325f41f Fix: Don't set dirty flag when shadow tiddler changes (#8903)
Adds `shadow` and `normal` flags to each entry in `changedTiddlers`,
indicating whether the corresponding version of the tiddler has changed.
Makes the saver handler ignore any changes that aren't flagged `normal`.

Fixes #8902.
2025-01-25 10:59:51 +00:00
Rhys-T
0219af604b Sign the CLA (#8904) 2025-01-23 21:48:45 +00:00
Jeremy Ruston
843f133f5e Merge branch 'tiddlywiki-com' 2025-01-23 21:48:03 +00:00
Jeremy Ruston
903d0fb8e1 Update CI due to deprecation of actions/upload-artifact@v3
See https://github.blog/changelog/2024-04-16-deprecation-notice-v3-of-the-artifact-actions/
2025-01-23 21:47:22 +00:00
Jeremy Ruston
53edea9256 Merge branch 'tiddlywiki-com' 2025-01-23 18:48:50 +00:00
Galen Huntington
b04af8bf7a Bug fix: TTF extension was wrong. update font types, add OTF type. (#8898)
* Bug fix: TTF extension was wrong.

* Update font MIME types throughout; add font/otf.
2025-01-23 18:18:02 +00:00
Jeremy Ruston
9aed6a5248 Update CI due to deprecation of actions/upload-artifact@v3
See https://github.blog/changelog/2024-04-16-deprecation-notice-v3-of-the-artifact-actions/
2025-01-23 18:05:56 +00:00
Galen Huntington
e9fb63affc Sign CLA. (#8899) 2025-01-21 14:43:36 +00:00
840 changed files with 3031 additions and 16531 deletions

317
.eslintrc.json Normal file
View File

@@ -0,0 +1,317 @@
{
"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"
}
}

View File

@@ -4,19 +4,18 @@ on:
branches:
- master
- tiddlywiki-com
- multi-wiki-support
env:
NODE_VERSION: "23"
NODE_VERSION: "22"
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "${{ env.NODE_VERSION }}"
- run: "./bin/ci-test.sh"
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report
@@ -31,8 +30,8 @@ jobs:
TW5_BUILD_MAIN_EDITION: "./editions/prerelease"
TW5_BUILD_OUTPUT: "./output/prerelease"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "${{ env.NODE_VERSION }}"
- run: "./bin/ci-pre-build.sh"
@@ -63,8 +62,8 @@ jobs:
TW5_BUILD_OUTPUT: "./output"
TW5_BUILD_ARCHIVE: "./output"
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "${{ env.NODE_VERSION }}"
- run: "./bin/ci-pre-build.sh"
@@ -83,14 +82,3 @@ jobs:
- run: "./bin/build-tw-org.sh"
env:
GH_TOKEN: ${{ secrets.GITHUBPUSHTOKEN }}
build-mws-tiddlywiki-com:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/multi-wiki-support'
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: "${{ env.NODE_VERSION }}"
- run: "./bin/build-mws-site.sh"
env:
GH_TOKEN: ${{ secrets.GITHUBPUSHTOKEN }}

2
.gitignore vendored
View File

@@ -5,9 +5,7 @@
tmp/
output/
node_modules/
store/
/test-results/
/playwright-report/
/playwright/.cache/
$__StoryList.tid
/editions/test/test-store/*

View File

@@ -1,4 +0,0 @@
The `multi-wiki-support` branch includes some changes that are not intended to be merged into the `master` branch:
* Readme update (see `editions/tw5.com/tiddlers/readme/ReadMe.tid`)
* Remove `multiwikiserver` plugin from `readme-bld.sh` (see `bin/readme-bld.sh`)

View File

@@ -1,97 +0,0 @@
#!/bin/bash
# Build mws.tiddlywiki.com assets.
# Default to the version of TiddlyWiki installed in this repo
if [ -z "$MWSTWCOM_BUILD_TIDDLYWIKI" ]; then
MWSTWCOM_BUILD_TIDDLYWIKI=./tiddlywiki.js
fi
echo "Using MWSTWCOM_BUILD_TIDDLYWIKI as [$MWSTWCOM_BUILD_TIDDLYWIKI]"
# Set up the build details
if [ -z "$MWSTWCOM_BUILD_DETAILS" ]; then
MWSTWCOM_BUILD_DETAILS="$(git symbolic-ref --short HEAD)-$(git rev-parse HEAD) from $(git remote get-url origin)"
fi
echo "Using MWSTWCOM_BUILD_DETAILS as [$MWSTWCOM_BUILD_DETAILS]"
if [ -z "$MWSTWCOM_BUILD_COMMIT" ]; then
MWSTWCOM_BUILD_COMMIT="$(git rev-parse HEAD)"
fi
echo "Using MWSTWCOM_BUILD_COMMIT as [$MWSTWCOM_BUILD_COMMIT]"
# Set up the build output directory
if [ -z "$MWSTWCOM_BUILD_OUTPUT" ]; then
MWSTWCOM_BUILD_OUTPUT=$(mktemp -d)
fi
mkdir -p $MWSTWCOM_BUILD_OUTPUT
if [ ! -d "$MWSTWCOM_BUILD_OUTPUT" ]; then
echo 'A valid MWSTWCOM_BUILD_OUTPUT environment variable must be set'
exit 1
fi
echo "Using MWSTWCOM_BUILD_OUTPUT as [$MWSTWCOM_BUILD_OUTPUT]"
# Pull existing GitHub pages content
git clone --depth=1 --branch=main "https://github.com/TiddlyWiki/mws.tiddlywiki.com-gh-pages.git" $MWSTWCOM_BUILD_OUTPUT
# Make the CNAME file that GitHub Pages requires
echo "mws.tiddlywiki.com" > $MWSTWCOM_BUILD_OUTPUT/CNAME
# Delete any existing static content
mkdir -p $MWSTWCOM_BUILD_OUTPUT/static
rm $MWSTWCOM_BUILD_OUTPUT/static/*
# Put the build details into a .tid file so that it can be included in each build (deleted at the end of this script)
echo -e -n "title: $:/build\ncommit: $MWSTWCOM_BUILD_COMMIT\n\n$MWSTWCOM_BUILD_DETAILS\n" > $MWSTWCOM_BUILD_OUTPUT/build.tid
######################################################
#
# mws.tiddlywiki.com distribution
#
######################################################
# /index.html 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 $MWSTWCOM_BUILD_TIDDLYWIKI \
editions/multiwikidocs \
--verbose \
--version \
--load $MWSTWCOM_BUILD_OUTPUT/build.tid \
--output $MWSTWCOM_BUILD_OUTPUT \
--build favicon static index \
|| exit 1
# Delete the temporary build tiddler
rm $MWSTWCOM_BUILD_OUTPUT/build.tid || exit 1
# Push output back to GitHub
# Exit script immediately if any command fails
set -e
pushd $MWSTWCOM_BUILD_OUTPUT
git config --global user.email "actions@github.com"
git config --global user.name "GitHub Actions"
git add -A .
git commit --message "GitHub build: $GITHUB_RUN_NUMBER of $TW5_BUILD_BRANCH ($(date +'%F %T %Z'))"
git remote add deploy "https://$GH_TOKEN@github.com/TiddlyWiki/mws.tiddlywiki.com-gh-pages.git" &>/dev/null
git push deploy main &>/dev/null
popd

View File

@@ -105,6 +105,7 @@ node $TW5_BUILD_TIDDLYWIKI \
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
@@ -117,7 +118,7 @@ node $TW5_BUILD_TIDDLYWIKI \
--version \
--load $TW5_BUILD_OUTPUT/build.tid \
--output $TW5_BUILD_OUTPUT \
--build favicon static index \
--build favicon static index external-js \
|| exit 1
# /empty.html Empty

View File

@@ -2,8 +2,6 @@
# test TiddlyWiki5 for tiddlywiki.com
npm install
node ./tiddlywiki.js \
./editions/test \
--verbose \

View File

@@ -10,7 +10,6 @@ fi
# tw5.com readmes
node $TW5_BUILD_TIDDLYWIKI \
+plugins/tiddlywiki/multiwikiserver \
editions/tw5.com \
--verbose \
--output . \

View File

@@ -232,10 +232,10 @@ $tw.utils.error = function(err) {
var link = dm("a"),
text = JSON.stringify(tiddlers);
if(Blob !== undefined) {
var blob = new Blob([text], {type: "text/html"});
var blob = new Blob([text], {type: "application/json"});
link.setAttribute("href", URL.createObjectURL(blob));
} else {
link.setAttribute("href","data:text/html," + encodeURIComponent(text));
link.setAttribute("href","data:application/json," + encodeURIComponent(text));
}
link.setAttribute("download","emergency-tiddlers-" + (new Date()) + ".json");
document.body.appendChild(link);
@@ -1068,6 +1068,10 @@ $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
@@ -1162,21 +1166,21 @@ enableIndexers - Array of indexer names to enable, or null to use all available
$tw.Wiki = function(options) {
options = options || {};
var self = this,
tiddlers = Object.create(null), // Hashmap of tiddlers
tiddlerTitles = null, // Array of tiddler titles
tiddlerStore = Object.create(null), // Hashmap of tiddlers
tiddlerTitles = null, // Array of tiddler titles, calculated and cached when needed
getTiddlerTitles = function() {
if(!tiddlerTitles) {
tiddlerTitles = Object.keys(tiddlers).sort(function(a,b) {return a.localeCompare(b);});
tiddlerTitles = Object.keys(tiddlerStore).sort(function(a,b) {return a.localeCompare(b);});
}
return tiddlerTitles;
},
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,
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
getShadowTiddlerTitles = function() {
if(!shadowTiddlerTitles) {
shadowTiddlerTitles = Object.keys(shadowTiddlers).sort(function(a,b) {return a.localeCompare(b);});
shadowTiddlerTitles = Object.keys(shadowTiddlerInfo).sort(function(a,b) {return a.localeCompare(b);});
}
return shadowTiddlerTitles;
},
@@ -1218,7 +1222,7 @@ $tw.Wiki = function(options) {
}
}
// Save the new tiddler
tiddlers[title] = tiddler;
tiddlerStore[title] = tiddler;
// Check we've got the title
tiddlerTitles = $tw.utils.insertSortedArray(tiddlerTitles || [],title);
// Record the new tiddler state
@@ -1243,7 +1247,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(tiddlers,title)) {
if($tw.utils.hop(tiddlerStore,title)) {
// Record the old tiddler state
var updateDescriptor = {
old: {
@@ -1253,7 +1257,7 @@ $tw.Wiki = function(options) {
}
}
// Delete the tiddler
delete tiddlers[title];
delete tiddlerStore[title];
// Delete it from the list of titles
if(tiddlerTitles) {
var index = tiddlerTitles.indexOf(title);
@@ -1281,11 +1285,11 @@ $tw.Wiki = function(options) {
// Get a tiddler from the store
this.getTiddler = function(title) {
if(title) {
var t = tiddlers[title];
var t = tiddlerStore[title];
if(t !== undefined) {
return t;
} else {
var s = shadowTiddlers[title];
var s = shadowTiddlerInfo[title];
if(s !== undefined) {
return s.tiddler;
}
@@ -1305,7 +1309,7 @@ $tw.Wiki = function(options) {
index,titlesLength,title;
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
callback(tiddlers[title],title);
callback(tiddlerStore[title],title);
}
};
@@ -1320,10 +1324,10 @@ $tw.Wiki = function(options) {
index,titlesLength,title;
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
if(tiddlers[title]) {
callback(tiddlers[title],title);
if(tiddlerStore[title]) {
callback(tiddlerStore[title],title);
} else {
var shadowInfo = shadowTiddlers[title];
var shadowInfo = shadowTiddlerInfo[title];
callback(shadowInfo.tiddler,title);
}
}
@@ -1335,13 +1339,13 @@ $tw.Wiki = function(options) {
titles = getTiddlerTitles();
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
callback(tiddlers[title],title);
callback(tiddlerStore[title],title);
}
titles = getShadowTiddlerTitles();
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
if(!tiddlers[title]) {
var shadowInfo = shadowTiddlers[title];
if(!tiddlerStore[title]) {
var shadowInfo = shadowTiddlerInfo[title];
callback(shadowInfo.tiddler,title);
}
}
@@ -1353,35 +1357,35 @@ $tw.Wiki = function(options) {
titles = getShadowTiddlerTitles();
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
if(tiddlers[title]) {
callback(tiddlers[title],title);
if(tiddlerStore[title]) {
callback(tiddlerStore[title],title);
} else {
var shadowInfo = shadowTiddlers[title];
var shadowInfo = shadowTiddlerInfo[title];
callback(shadowInfo.tiddler,title);
}
}
titles = getTiddlerTitles();
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
if(!shadowTiddlers[title]) {
callback(tiddlers[title],title);
if(!shadowTiddlerInfo[title]) {
callback(tiddlerStore[title],title);
}
}
};
// Test for the existence of a tiddler (excludes shadow tiddlers)
this.tiddlerExists = function(title) {
return !!$tw.utils.hop(tiddlers,title);
return !!$tw.utils.hop(tiddlerStore,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(shadowTiddlers,title);
return $tw.utils.hop(shadowTiddlerInfo,title);
};
this.getShadowSource = function(title) {
if($tw.utils.hop(shadowTiddlers,title)) {
return shadowTiddlers[title].source;
if($tw.utils.hop(shadowTiddlerInfo,title)) {
return shadowTiddlerInfo[title].source;
}
return null;
};
@@ -1389,8 +1393,8 @@ $tw.Wiki = function(options) {
// Get an array of all the currently recognised plugin types
this.getPluginTypes = function() {
var types = [];
$tw.utils.each(pluginTiddlers,function(pluginTiddler) {
var pluginType = pluginTiddler.fields["plugin-type"];
$tw.utils.each(pluginTiddlersInfo,function(pluginTiddlerFields) {
var pluginType = pluginTiddlerFields["plugin-type"];
if(pluginType && types.indexOf(pluginType) === -1) {
types.push(pluginType);
}
@@ -1398,22 +1402,45 @@ $tw.Wiki = function(options) {
return types;
};
// Read plugin info for all plugins, or just an array of titles. Returns the number of plugins updated or deleted
// 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
this.readPluginInfo = function(titles) {
var results = {
var self = this,
results = {
modifiedPlugins: [],
deletedPlugins: []
deletedPlugins: [],
deletedPluginContents: {}
};
$tw.utils.each(titles || getTiddlerTitles(),function(title) {
var tiddler = tiddlers[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;
}
}
}
if(tiddler) {
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);
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);
}
} else {
if(pluginInfo[title]) {
delete pluginInfo[title];
if(pluginContents[title]) {
results.deletedPluginContents[title] = {tiddlers: pluginContents[title].contents};
delete pluginContents[title];
results.deletedPlugins.push(title);
}
}
@@ -1421,34 +1448,42 @@ $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) {
return pluginInfo[title];
var pluginContent = pluginContents[title];
if(pluginContent) {
return {tiddlers: pluginContent.contents, subPluginTitles: pluginContent.subPluginTitles, fields: pluginContent.fields};
} else {
return null;
}
};
// 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 = [],
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);
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);
}
}
};
if(titles) {
$tw.utils.each(titles,function(title) {
checkTiddler(self.getTiddler(title),title);
});
} else {
this.each(function(tiddler,title) {
checkTiddler(tiddler,title);
});
}
}
});
return registeredTitles;
};
@@ -1457,11 +1492,11 @@ $tw.Wiki = function(options) {
var self = this,
unregisteredTitles = [];
// Remove any previous registered plugins of this type
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);
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);
}
}
return unregisteredTitles;
@@ -1471,36 +1506,33 @@ $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
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;
pluginTiddlersInfo.sort(function(a, b) {
var priorityA = "plugin-priority" in a ? a["plugin-priority"] : 1,
priorityB = "plugin-priority" in b ? b["plugin-priority"] : 1;
if (priorityA !== priorityB) {
return priorityA - priorityB;
} else if (a.fields.title < b.fields.title) {
} else if (a.title < b.title) {
return -1;
} else if (a.fields.title === b.fields.title) {
} else if (a.title === b.title) {
return 0;
} else {
return +1;
}
});
// Now go through the plugins in ascending order and assign the shadows
shadowTiddlers = Object.create(null);
$tw.utils.each(pluginTiddlers,function(tiddler) {
shadowTiddlerInfo = Object.create(null);
$tw.utils.each(pluginTiddlersInfo,function(tiddlerFields) {
var contents = pluginContents[tiddlerFields.title].contents;
// Extract the constituent tiddlers
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})
};
}
});
}
$tw.utils.each(contents,function(constituentTiddler,constituentTitle) {
// Save the tiddler object
shadowTiddlerInfo[constituentTitle] = {
source: tiddlerFields.title,
tiddler: new $tw.Tiddler(constituentTiddler,{title: constituentTitle})
};
});
});
shadowTiddlerTitles = null;
shadowTiddlerTitles = null; // Force regeneration of the shadow tiddler titles list
this.clearCache(null);
this.clearGlobalCache();
$tw.utils.each(indexers,function(indexer) {
@@ -1902,8 +1934,16 @@ $tw.loadTiddlersFromFile = function(filepath,fields) {
extensionInfo = $tw.utils.getFileExtensionInfo(ext),
type = extensionInfo ? extensionInfo.type : null,
typeInfo = type ? $tw.config.contentTypeInfo[type] : null,
data = fs.readFileSync(filepath,typeInfo ? typeInfo.encoding : "utf8"),
tiddlers = $tw.wiki.deserializeTiddlers(ext,data,fields),
fileSize = fs.statSync(filepath).size,
data;
if(fileSize > $tw.config.maxEditFileSize) {
data = "File " + filepath + "not loaded because it is too large";
console.log("Warning: " + data);
ext = ".txt";
} else {
data = fs.readFileSync(filepath,typeInfo ? typeInfo.encoding : "utf8");
}
var tiddlers = $tw.wiki.deserializeTiddlers(ext,data,fields),
metadata = $tw.loadMetadataForFile(filepath);
if(metadata) {
if(type === "application/json") {
@@ -1936,7 +1976,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) {
$tw.loadTiddlersFromPath = function(filepath,excludeRegExp,excludePluginInfo) {
excludeRegExp = excludeRegExp || $tw.boot.excludeRegExp;
var tiddlers = [];
if(fs.existsSync(filepath)) {
@@ -1946,11 +1986,17 @@ $tw.loadTiddlersFromPath = function(filepath,excludeRegExp) {
// 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(filepath + path.sep + file,excludeRegExp));
tiddlers.push.apply(tiddlers,$tw.loadTiddlersFromPath(path.join(filepath,file),excludeRegExp));
}
});
}
@@ -2097,54 +2143,69 @@ 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;
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);
function readPluginFields(filepath) {
if(!(fs.existsSync(filepath) && fs.statSync(filepath).isDirectory())) {
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 = {};
var infoPath = path.join(filepath,"plugin.info");
// Read the plugin information file
if(!fs.existsSync(infoPath) || !fs.statSync(infoPath).isFile()) {
return null;
}
// 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);
var pluginFields = $tw.utils.parseJSONSafe(fs.readFileSync(infoPath,"utf8"),{});
if(!(pluginFields.title && pluginFields.name)) {
return null;
}
// 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
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) {
pluginInfo.tiddlers[tiddler.title] = tiddler;
pluginTiddlers[tiddler.title] = tiddler;
}
}
}
// 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;
return pluginTiddlers;
}
// 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;
};
/*
@@ -2463,13 +2524,15 @@ $tw.boot.initStartup = function(options) {
$tw.utils.registerFileType("image/webp","base64",".webp",{flags:["image"]});
$tw.utils.registerFileType("image/heic","base64",".heic",{flags:["image"]});
$tw.utils.registerFileType("image/heif","base64",".heif",{flags:["image"]});
$tw.utils.registerFileType("image/avif","base64",".avif",{flags:["image"]});
$tw.utils.registerFileType("image/svg+xml","utf8",".svg",{flags:["image"]});
$tw.utils.registerFileType("image/vnd.microsoft.icon","base64",".ico",{flags:["image"]});
$tw.utils.registerFileType("image/x-icon","base64",".ico",{flags:["image"]});
$tw.utils.registerFileType("application/wasm","base64",".wasm");
$tw.utils.registerFileType("application/font-woff","base64",".woff");
$tw.utils.registerFileType("application/x-font-ttf","base64",".woff");
$tw.utils.registerFileType("application/font-woff2","base64",".woff2");
$tw.utils.registerFileType("font/woff","base64",".woff");
$tw.utils.registerFileType("font/woff2","base64",".woff2");
$tw.utils.registerFileType("font/ttf","base64",".ttf");
$tw.utils.registerFileType("font/otf","base64",".otf");
$tw.utils.registerFileType("audio/ogg","base64",".ogg");
$tw.utils.registerFileType("audio/mp4","base64",[".mp4",".m4a"]);
$tw.utils.registerFileType("video/ogg","base64",[".ogm",".ogv",".ogg"]);

View File

@@ -19,6 +19,10 @@ var _bootprefix = (function($tw) {
$tw = $tw || Object.create(null);
$tw.boot = $tw.boot || Object.create(null);
// Config
$tw.config = $tw.config || Object.create(null);
$tw.config.maxEditFileSize = 100 * 1024 * 1024; // 100MB
// Detect platforms
if(!("browser" in $tw)) {
$tw.browser = typeof(window) !== "undefined" && typeof(document) !== "undefined" ? {} : null;

View File

@@ -5,7 +5,3 @@ TiddlyWiki incorporates code from these fine OpenSource projects:
* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]
* [[The Jasmine JavaScript Test Framework|https://jasmine.github.io/]]
* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]
And media from these projects:
* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]

5
core/images/language.tid Normal file
View File

@@ -0,0 +1,5 @@
title: $:/core/images/language
tags: $:/tags/Image
\parameters (size:"22pt")
<svg width=<<size>> height=<<size>> class="tc-image-language tc-image-button" viewBox="0 0 92 92"><path d="M0 0h2480.32v3507.87H0z" style="fill:none" transform="scale(.03696 .02613)"/><path d="M71.508 62.298c-1.243 15.83-16.758 28.344-35.714 28.344-5.713 0-11.113-1.136-15.905-3.158-2.977 2.498-8.618 4.183-15.088 4.183-.929 0-1.84-.034-2.73-.102 4.499-1.5 7.989-4.886 9.298-9.099C4.373 76.918 0 69.016 0 60.246 0 49.773 6.237 40.537 15.729 35.07c1.235 7.764 5.492 14.713 11.724 19.953l-7.269 18.453c-.393.976-.676 1.737-.847 2.285a5.326 5.326 0 0 0-.256 1.591c0 .89.368 1.686 1.103 2.388.736.702 1.583 1.052 2.542 1.052 1.13 0 1.942-.33 2.438-.988.497-.659 1.096-1.93 1.797-3.812l1.797-4.826h15.3l1.797 4.723c.239.582.526 1.254.86 2.015.333.762.646 1.327.936 1.695.291.368.65.659 1.078.873.428.213.942.32 1.54.32a3.586 3.586 0 0 0 2.632-1.09c.727-.728 1.09-1.528 1.09-2.4 0-.84-.384-2.183-1.154-4.031l-3.545-8.755c2.142.3 4.34.455 6.58.455 5.541 0 10.824-.951 15.636-2.674Zm-30.563.247 1.059 2.898H30.76l2.32-6.467a43.152 43.152 0 0 0 7.865 3.569Z"/><path d="M71.778 57.635c-4.793 2.023-10.191 3.157-15.907 3.157-19.767 0-35.793-13.61-35.793-30.396S36.104.001 55.87.001c19.772 0 35.797 13.61 35.797 30.395 0 8.77-4.373 16.674-11.371 22.221 1.309 4.211 4.8 7.6 9.299 9.1-.89.067-1.802.1-2.73.1-6.47 0-12.11-1.686-15.088-4.182Zm-15.59-15.887a44.237 44.237 0 0 0 3.3 2.496c4.284 2.942 9.06 5.381 14.33 7.315l2.334-3.517c-5.134-1.871-9.696-4.125-13.69-6.763a42.558 42.558 0 0 1-3.37-2.483c4.247-4.806 7.374-10.43 9.38-16.869h6.698V17.78h-16.7a47.226 47.226 0 0 0-1.528-2.959 52.943 52.943 0 0 0-2.885-4.562l-4.218 1.554a36.467 36.467 0 0 1 2.971 3.983c.427.661.833 1.323 1.217 1.984H36.394v4.148h6.77a36.878 36.878 0 0 0 5.422 11.56 42.918 42.918 0 0 0 4.591 5.497c-4.687 4.017-10.548 6.932-17.582 8.744l2.247 3.709c7.746-2.44 13.861-5.67 18.347-9.689Zm-9.047-19.82h16.991c-1.86 5.668-4.528 10.402-8 14.204a42.526 42.526 0 0 1-4.247-4.922c-2.126-2.883-3.71-5.977-4.744-9.283Z"/></svg>

View File

@@ -3,5 +3,8 @@ name: en-GB
description: English (British)
author: JeremyRuston
core-version: >=5.0.0"
plugin-type: language
type: application/json
hidden: yes
Stub pseudo-plugin for the default language
{tidddlers:{}}

View File

@@ -1,13 +0,0 @@
title: $:/languages/en-GB/icon
type: image/svg+xml
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 30" width="1200" height="600">
<clipPath id="t">
<path d="M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z"/>
</clipPath>
<path d="M0,0 v30 h60 v-30 z" fill="#00247d"/>
<path d="M0,0 L60,30 M60,0 L0,30" stroke="#fff" stroke-width="6"/>
<path d="M0,0 L60,30 M60,0 L0,30" clip-path="url(#t)" stroke="#cf142b" stroke-width="4"/>
<path d="M30,0 v30 M0,15 h60" stroke="#fff" stroke-width="10"/>
<path d="M30,0 v30 M0,15 h60" stroke="#cf142b" stroke-width="6"/>
</svg>

View File

@@ -6,10 +6,7 @@ module-type: global
The $tw.Commander class is a command interpreter
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -38,13 +35,6 @@ Commander.prototype.log = function(str) {
}
};
/*
Clear pending commands
*/
Commander.prototype.clearCommands = function() {
this.commandTokens = this.commandTokens.slice(0,this.nextToken);
};
/*
Write a string if verbose flag is set
*/
@@ -180,5 +170,3 @@ Commander.initCommands = function(moduleType) {
};
exports.Commander = Commander;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Command to build a build target
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -48,5 +45,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Clear password for crypto operations
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -29,5 +26,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -7,10 +7,6 @@ Runs the commands returned from a filter
\*/
(function() {
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -38,5 +34,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Command to delete tiddlers
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -38,5 +35,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Command to list the available editions
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -35,5 +32,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Commands to fetch external tiddlers
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -171,5 +168,3 @@ Command.prototype.processBody = function(body,type,options,url) {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Help command
\*/
(function(){
/*jshint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -37,5 +34,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Command to import tiddlers from a file
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -44,5 +41,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Command to initialise an empty wiki folder
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -55,5 +52,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,17 +6,14 @@ module-type: command
Listen for HTTP requests and serve tiddlers
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var Server = require("$:/core/modules/server/server.js").Server;
exports.info = {
name: "listen",
synchronous: false,
synchronous: true,
namedParameterMode: true,
mandatoryParameters: []
};
@@ -38,15 +35,9 @@ Command.prototype.execute = function() {
wiki: this.commander.wiki,
variables: self.params
});
var nodeServer = this.server.listen(null,null,null,{
callback: function() {
self.callback();
}
});
var nodeServer = this.server.listen();
$tw.hooks.invokeHook("th-server-command-post-start",this.server,nodeServer,"tiddlywiki");
return null;
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Command to load tiddlers from a file or directory
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -47,5 +44,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Command to pack all of the plugins in the library into a plugin tiddler of type "library"
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -41,5 +38,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Command to set the default output location (defaults to current working directory)
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -34,5 +31,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Save password for crypto operations
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -32,5 +29,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -1,37 +0,0 @@
/*\
title: $:/core/modules/commands/quit.js
type: application/javascript
module-type: command
Immediately ends the TiddlyWiki process
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
name: "quit",
synchronous: true
};
var Command = function(params,commander,callback) {
var self = this;
this.params = params;
this.commander = commander;
this.callback = callback;
};
Command.prototype.execute = function() {
// Clear any pending commands
this.commander.clearCommands();
// We don't actually quit, we just issue the "th-quit" hook to give listeners a chance to exit
$tw.hooks.invokeHook("th-quit");
return null;
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Render individual tiddlers and save the results to the specified files
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var widget = require("$:/core/modules/widgets/widget.js");
@@ -66,6 +63,3 @@ Render individual tiddlers and save the results to the specified files
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Command to render a tiddler and save it to a file
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -53,5 +50,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Command to render several tiddlers to a folder of files
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var widget = require("$:/core/modules/widgets/widget.js");
@@ -65,5 +62,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Saves individual tiddlers in their raw text or binary format to the specified files
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -64,6 +61,3 @@ Saves individual tiddlers in their raw text or binary format to the specified fi
};
exports.Command = Command;
})();

View File

@@ -16,10 +16,7 @@ The pathname specifies the pathname to the folder in which the JSON files should
The skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -94,5 +91,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Command to save the content of a tiddler to a file
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -47,5 +44,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Command to save several tiddlers to a folder of files
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var widget = require("$:/core/modules/widgets/widget.js");
@@ -52,5 +49,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -15,10 +15,7 @@ The following options are supported:
Supports backward compatibility with --savewikifolder <wikifolderpath> [<filter>] [ [<name>=<value>] ]*
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -221,5 +218,3 @@ WikiFolderMaker.prototype.saveFile = function(filename,encoding,data) {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Deprecated legacy command for serving tiddlers
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var Server = require("$:/core/modules/server/server.js").Server;
@@ -51,5 +48,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Command to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var widget = require("$:/core/modules/widgets/widget.js");
@@ -54,5 +51,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Command to extract the shadow tiddlers from within a plugin
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -40,5 +37,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Verbose command
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -30,5 +27,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: command
Version command
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.info = {
@@ -28,5 +25,3 @@ Command.prototype.execute = function() {
};
exports.Command = Command;
})();

View File

@@ -6,10 +6,7 @@ module-type: config
Core configuration constants
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.preferences = {};
@@ -37,5 +34,3 @@ exports.htmlVoidElements = "area,base,br,col,command,embed,hr,img,input,keygen,l
exports.htmlBlockElements = "address,article,aside,audio,blockquote,canvas,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,nav,ol,p,pre,section,summary,table,tfoot,ul,video".split(",");
exports.htmlUnsafeElements = "script".split(",");
})();

View File

@@ -6,10 +6,7 @@ module-type: tiddlerdeserializer
Functions to deserialise tiddlers from a block of text
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["application/x-tiddler-html-div"] = function(text,fields) {
@@ -181,5 +178,3 @@ var deserializeTiddlerDiv = function(text /* [,fields] */) {
}
return undefined;
};
})();

View File

@@ -6,10 +6,7 @@ module-type: library
Text editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea
\*/
(function(){
/*jslint node: true,browser: true */
/*global $tw: false */
"use strict";
var HEIGHT_VALUE_TITLE = "$:/config/TextEditor/EditorHeight/Height";
@@ -273,5 +270,3 @@ FramedEngine.prototype.executeTextOperation = function(operation) {
};
exports.FramedEngine = FramedEngine;
})();

View File

@@ -6,10 +6,7 @@ module-type: library
Text editor engine based on a simple input or textarea tag
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var HEIGHT_VALUE_TITLE = "$:/config/TextEditor/EditorHeight/Height";
@@ -172,5 +169,3 @@ SimpleEngine.prototype.executeTextOperation = function(operation) {
};
exports.SimpleEngine = SimpleEngine;
})();

View File

@@ -6,10 +6,7 @@ module-type: library
Factory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var DEFAULT_MIN_TEXT_AREA_HEIGHT = "100px"; // Minimum height of textareas in pixels
@@ -386,5 +383,3 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
}
exports.editTextWidgetFactory = editTextWidgetFactory;
})();

View File

@@ -6,10 +6,7 @@ module-type: bitmapeditoroperation
Bitmap editor operation to clear the image
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["clear"] = function(event) {
@@ -20,5 +17,3 @@ exports["clear"] = function(event) {
// Save changes
this.strokeEnd();
};
})();

View File

@@ -6,10 +6,7 @@ module-type: bitmapeditoroperation
Bitmap editor operation to resize the image
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["resize"] = function(event) {
@@ -25,5 +22,3 @@ exports["resize"] = function(event) {
// Save the image into the tiddler
this.saveChanges();
};
})();

View File

@@ -6,10 +6,7 @@ module-type: bitmapeditoroperation
Bitmap editor operation to rotate the image left by 90 degrees
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["rotate-left"] = function(event) {
@@ -20,5 +17,3 @@ exports["rotate-left"] = function(event) {
// Save the image into the tiddler
this.saveChanges();
};
})();

View File

@@ -6,10 +6,7 @@ module-type: texteditoroperation
Text editor operation to excise the selection to a new tiddler
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
function isMarkdown(mediaType) {
@@ -53,5 +50,3 @@ exports["excise"] = function(event,operation) {
operation.newSelStart = operation.selStart;
operation.newSelEnd = operation.selStart + operation.replacement.length;
};
})();

View File

@@ -4,14 +4,9 @@ type: application/javascript
module-type: texteditoroperation
Simply focus the Text editor
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["focus-editor"] = function(event,operation) {
operation = null;
};
})();

View File

@@ -6,10 +6,7 @@ module-type: texteditoroperation
Text editor operation insert text at the caret position. If there is a selection it is replaced.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["insert-text"] = function(event,operation) {
@@ -19,5 +16,3 @@ exports["insert-text"] = function(event,operation) {
operation.newSelStart = operation.selStart + operation.replacement.length;
operation.newSelEnd = operation.newSelStart;
};
})();

View File

@@ -6,10 +6,7 @@ module-type: texteditoroperation
Text editor operation to make a link
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["make-link"] = function(event,operation) {
@@ -25,5 +22,3 @@ exports["make-link"] = function(event,operation) {
operation.newSelStart = operation.selStart + operation.replacement.length;
operation.newSelEnd = operation.newSelStart;
};
})();

View File

@@ -6,10 +6,7 @@ module-type: texteditoroperation
Text editor operation to add a prefix to the selected lines
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["prefix-lines"] = function(event,operation) {
@@ -51,5 +48,3 @@ exports["prefix-lines"] = function(event,operation) {
operation.newSelEnd = operation.newSelStart + operation.replacement.length;
}
};
})();

View File

@@ -6,10 +6,7 @@ module-type: texteditoroperation
Text editor operation to replace the entire text
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["replace-all"] = function(event,operation) {
@@ -19,5 +16,3 @@ exports["replace-all"] = function(event,operation) {
operation.newSelStart = 0;
operation.newSelEnd = operation.replacement.length;
};
})();

View File

@@ -6,10 +6,7 @@ module-type: texteditoroperation
Text editor operation to replace the selection
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["replace-selection"] = function(event,operation) {
@@ -19,5 +16,3 @@ exports["replace-selection"] = function(event,operation) {
operation.newSelStart = operation.selStart;
operation.newSelEnd = operation.selStart + operation.replacement.length;
};
})();

View File

@@ -6,10 +6,7 @@ module-type: texteditoroperation
Text editor operation to save the current selection in a specified tiddler
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["save-selection"] = function(event,operation) {
@@ -19,5 +16,3 @@ exports["save-selection"] = function(event,operation) {
this.wiki.setText(tiddler,field,null,operation.text.substring(operation.selStart,operation.selEnd));
}
};
})();

View File

@@ -6,10 +6,7 @@ module-type: texteditoroperation
Text editor operation to wrap the selected lines with a prefix and suffix
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["wrap-lines"] = function(event,operation) {
@@ -43,5 +40,3 @@ exports["wrap-lines"] = function(event,operation) {
operation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);
}
};
})();

View File

@@ -6,10 +6,7 @@ module-type: texteditoroperation
Text editor operation to wrap the selection with the specified prefix and suffix
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["wrap-selection"] = function(event,operation) {
@@ -134,5 +131,3 @@ exports["wrap-selection"] = function(event,operation) {
addPrefixSuffix();
}
};
})();

View File

@@ -7,10 +7,7 @@ Union of sets without de-duplication.
Equivalent to = filter run prefix.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -21,5 +18,3 @@ exports.all = function(operationSubFunction) {
results.push.apply(results, operationSubFunction(source,widget));
};
};
})();

View File

@@ -7,10 +7,7 @@ Intersection of sets.
Equivalent to + filter run prefix.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -24,5 +21,3 @@ exports.and = function(operationSubFunction,options) {
results.pushTop(operationSubFunction(source,widget));
};
};
})();

View File

@@ -3,10 +3,7 @@ title: $:/core/modules/filterrunprefixes/cascade.js
type: application/javascript
module-type: filterrunprefix
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -39,5 +36,3 @@ exports.cascade = function(operationSubFunction,options) {
}
}
};
})();

View File

@@ -6,10 +6,7 @@ module-type: filterrunprefix
Equivalent to ~ filter run prefix.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -23,5 +20,3 @@ exports.else = function(operationSubFunction) {
}
};
};
})();

View File

@@ -7,10 +7,7 @@ Difference of sets.
Equivalent to - filter run prefix.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -21,5 +18,3 @@ exports.except = function(operationSubFunction) {
results.remove(operationSubFunction(source,widget));
};
};
})();

View File

@@ -4,10 +4,7 @@ type: application/javascript
module-type: filterrunprefix
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -35,5 +32,3 @@ exports.filter = function(operationSubFunction,options) {
}
}
};
})();

View File

@@ -4,10 +4,7 @@ type: application/javascript
module-type: filterrunprefix
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -27,5 +24,3 @@ exports.intersection = function(operationSubFunction) {
}
};
};
})();

View File

@@ -3,10 +3,7 @@ title: $:/core/modules/filterrunprefixes/map.js
type: application/javascript
module-type: filterrunprefix
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -40,5 +37,3 @@ exports.map = function(operationSubFunction,options) {
}
}
};
})();

View File

@@ -6,10 +6,7 @@ module-type: filterrunprefix
Equivalent to a filter run with no prefix.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -20,5 +17,3 @@ exports.or = function(operationSubFunction) {
results.pushTop(operationSubFunction(source,widget));
};
};
})();

View File

@@ -3,10 +3,7 @@ title: $:/core/modules/filterrunprefixes/reduce.js
type: application/javascript
module-type: filterrunprefix
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -36,5 +33,3 @@ exports.reduce = function(operationSubFunction,options) {
}
}
};
})();

View File

@@ -4,10 +4,7 @@ type: application/javascript
module-type: filterrunprefix
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -48,5 +45,3 @@ exports.sort = function(operationSubFunction,options) {
}
}
};
})();

View File

@@ -6,10 +6,7 @@ module-type: filterrunprefix
Replace results of previous runs unless empty
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -28,5 +25,3 @@ exports.then = function(operationSubFunction) {
}
};
};
})();

View File

@@ -6,10 +6,7 @@ module-type: wikimethod
Adds tiddler filtering methods to the $tw.Wiki object.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var widgetClass = require("$:/core/modules/widgets/widget.js").widget;
@@ -367,5 +364,3 @@ exports.compileFilter = function(filterString) {
this.filterCacheCount++;
return fnMeasured;
};
})();

View File

@@ -8,10 +8,7 @@ especially useful in contexts where only a filter expression is allowed
and macro substitution isn't available.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -24,5 +21,3 @@ exports.addprefix = function(source,operator,options) {
});
return results;
};
})();

View File

@@ -8,10 +8,7 @@ especially useful in contexts where only a filter expression is allowed
and macro substitution isn't available.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -24,5 +21,3 @@ exports.addsuffix = function(source,operator,options) {
});
return results;
};
})();

View File

@@ -6,10 +6,7 @@ module-type: filteroperator
Filter operator returning the tiddler from the current list that is after the tiddler named in the operand.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -27,5 +24,3 @@ exports.after = function(source,operator,options) {
return [results[index + 1]];
}
};
})();

View File

@@ -8,10 +8,7 @@ Filter operator for selecting tiddlers
[all[shadows+tiddlers]]
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var allFilterOperators;
@@ -54,5 +51,3 @@ exports.all = function(source,operator,options) {
}
return results.makeTiddlerIterator(options.wiki);
};
})();

View File

@@ -6,10 +6,7 @@ module-type: allfilteroperator
Filter function for [all[current]]
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -23,5 +20,3 @@ exports.current = function(source,prefix,options) {
return [];
}
};
})();

View File

@@ -6,10 +6,7 @@ module-type: allfilteroperator
Filter function for [all[missing]]
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -18,5 +15,3 @@ Export our filter function
exports.missing = function(source,prefix,options) {
return options.wiki.getMissingTitles();
};
})();

View File

@@ -6,10 +6,7 @@ module-type: allfilteroperator
Filter function for [all[orphans]]
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -18,5 +15,3 @@ Export our filter function
exports.orphans = function(source,prefix,options) {
return options.wiki.getOrphanTitles();
};
})();

View File

@@ -6,10 +6,7 @@ module-type: allfilteroperator
Filter function for [all[shadows]]
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -18,5 +15,3 @@ Export our filter function
exports.shadows = function(source,prefix,options) {
return options.wiki.allShadowTitles();
};
})();

View File

@@ -6,10 +6,7 @@ module-type: allfilteroperator
Filter function for [all[tags]]
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -18,5 +15,3 @@ Export our filter function
exports.tags = function(source,prefix,options) {
return Object.keys(options.wiki.getTagMap());
};
})();

View File

@@ -6,10 +6,7 @@ module-type: allfilteroperator
Filter function for [all[tiddlers]]
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -18,5 +15,3 @@ Export our filter function
exports.tiddlers = function(source,prefix,options) {
return options.wiki.allTitles();
};
})();

View File

@@ -6,10 +6,7 @@ module-type: filteroperator
Filter operator for returning all the backlinks from a tiddler
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -22,5 +19,3 @@ exports.backlinks = function(source,operator,options) {
});
return results.makeTiddlerIterator(options.wiki);
};
})();

View File

@@ -7,9 +7,6 @@ Filter operator for returning all the backtranscludes from a tiddler
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*

View File

@@ -6,10 +6,7 @@ module-type: filteroperator
Filter operator returning the tiddler from the current list that is before the tiddler named in the operand.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -27,5 +24,3 @@ exports.before = function(source,operator,options) {
return [results[index - 1]];
}
};
})();

View File

@@ -6,10 +6,7 @@ module-type: filteroperator
Filter operator for returning the names of the commands available in this wiki
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -23,5 +20,3 @@ exports.commands = function(source,operator,options) {
results.sort();
return results;
};
})();

View File

@@ -6,10 +6,7 @@ module-type: filteroperator
General purpose comparison operator
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.compare = function(source,operator,options) {
@@ -36,5 +33,3 @@ var modes = {
"lteq": function(value) {return value <= 0;},
"lt": function(value) {return value < 0;}
}
})();

View File

@@ -6,10 +6,7 @@ module-type: filteroperator
Filter operator for finding values in array fields
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -41,5 +38,3 @@ exports.contains = function(source,operator,options) {
}
return results;
};
})();

View File

@@ -6,10 +6,7 @@ module-type: filteroperator
Filter operator returning the number of entries in the current list.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -22,5 +19,3 @@ exports.count = function(source,operator,options) {
});
return [count + ""];
};
})();

View File

@@ -6,10 +6,7 @@ module-type: filteroperator
Filter operators for cryptography, using the Stanford JavaScript library
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.sha256 = function(source,operator,options) {
@@ -20,5 +17,3 @@ exports.sha256 = function(source,operator,options) {
});
return results;
};
})();

View File

@@ -6,10 +6,7 @@ module-type: filteroperator
Filter operator that selects tiddlers with a specified date field within a specified date interval.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -46,5 +43,3 @@ exports.days = function(source,operator,options) {
}
return results;
};
})();

View File

@@ -4,10 +4,7 @@ type: application/javascript
module-type: filteroperator
Filter operator for deserializing string data into JSON representing tiddlers
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports["deserialize"] = function(source,operator,options) {
@@ -35,5 +32,3 @@ exports["deserialize"] = function(source,operator,options) {
}
return results;
}
})();

View File

@@ -6,10 +6,7 @@ module-type: filteroperator
Filter operator for returning the names of the deserializers in this wiki
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -23,5 +20,3 @@ exports.deserializers = function(source,operator,options) {
results.sort();
return results;
};
})();

View File

@@ -6,10 +6,7 @@ module-type: filteroperator
Filter function for [duplicateslugs[]]
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -32,5 +29,3 @@ exports.duplicateslugs = function(source,operator,options) {
});
return results;
};
})();

View File

@@ -7,10 +7,7 @@ Filter operator that selects one tiddler for each unique value of the specified
With suffix "list", selects all tiddlers that are values in a specified list field.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -63,5 +60,3 @@ exports.each = function(source,operator,options) {
}
return results;
};
})();

View File

@@ -6,10 +6,7 @@ module-type: filteroperator
Filter operator that selects one tiddler for each unique day covered by the specified date field
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -35,5 +32,3 @@ exports.eachday = function(source,operator,options) {
});
return results;
};
})();

View File

@@ -6,10 +6,7 @@ module-type: filteroperator
Filter operator for returning the descriptions of the specified edition names
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -29,5 +26,3 @@ exports.editiondescription = function(source,operator,options) {
}
return results;
};
})();

View File

@@ -6,10 +6,7 @@ module-type: filteroperator
Filter operator for returning the names of the available editions in this wiki
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
@@ -28,5 +25,3 @@ exports.editions = function(source,operator,options) {
}
return results;
};
})();

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