1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2026-02-13 13:39:50 +00:00

Compare commits

..

79 Commits

Author SHA1 Message Date
lin onetwo
53edb20da5 AI tools: add more servers (#8966)
* feat: add tree

* refactor: make tools and settings extensible

* fix: shining color on dark mode

* feat: allow choose model, and use authTokenStoreKey for different server

* feat: allow extends openai api

* fix: Input tag 'error' found using 'role' does not match any of the expected tags: 'system', 'user', 'assistant', 'tool'"

* fix: shining result color on dark mode

* Delete import-chatgpt.tid

* feat: add deepseek

* feat: Assign a server and model on tiddler if user lazy or forget to pick one.

* feat: allow config default server and model
2025-06-09 09:43:36 +01:00
Jeremy Ruston
ce9209f00e Merge branch 'master' into feat-ai-tools 2025-03-06 17:42:02 +00:00
Mario Pietsch
4822919aa4 fix .median sort function (#8971) 2025-03-03 17:11:16 +00:00
Jeremy Ruston
a6f7c05203 Merge branch 'master' into feat-ai-tools 2025-03-02 17:16:59 +00:00
Cameron Fischer
0dda07e3f1 Fix for #5930: missing tiddlers with checkbox indexes (#8964) 2025-02-27 18:02:43 +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
Mario Pietsch
0f79f88f58 Fix problem toc-selective-expandable (#8959)
fix problem toc-selective-expandable
2025-02-24 20:49:48 +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
d3f441cbb5 Unpack plugins for wiki based tests 2025-02-18 21:15:01 +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
Mario Pietsch
7ea788ca83 fix page save button wikify update problem (#8956) 2025-02-18 09:06:14 +00:00
Mario Pietsch
614ba8432f [DOCS] Improve External Images Docs (#8954) 2025-02-17 16:13:38 +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
Galen Huntington
e9fb63affc Sign CLA. (#8899) 2025-01-21 14:43:36 +00:00
Jeremy Ruston
ceddef7b51 Merge branch 'master' into feat-ai-tools 2024-10-10 15:11:20 +01:00
Jeremy Ruston
db692738fe Allow content type of user input to be specified
Useful to use text/plain for code
2024-10-10 14:54:12 +01:00
Jeremy Ruston
8efec8920d User messages should be wikified
Makes it possible to include other tiddlers in a prompt
2024-10-10 13:22:59 +01:00
Jeremy Ruston
904155043a Merge branch 'master' into feat-ai-tools 2024-10-09 21:51:36 +01:00
Jeremy Ruston
97c9456f21 Merge branch 'master' into feat-ai-tools 2024-09-30 16:43:36 +01:00
Jeremy Ruston
a1a6b6fa25 Merge branch 'master' into feat-ai-tools 2024-08-30 14:13:58 +01:00
Jeremy Ruston
422df10841 Fix ChatGPT import 2024-08-05 16:33:07 +01:00
Jeremy Ruston
ea595dfe2f Refactor procedures and functions to be global for reuse 2024-07-28 13:07:24 +01:00
Jeremy Ruston
58f96e779a Add documentation for the conversation format 2024-07-28 12:52:43 +01:00
Jeremy Ruston
a32a1a3802 Merge branch 'master' into feat-ai-tools 2024-07-28 12:39:43 +01:00
Jeremy Ruston
28d262e371 Merge branch 'master' into feat-ai-tools 2024-07-27 17:16:43 +01:00
Jeremy Ruston
cd58622c06 Clarify that the Llamafile prompt is for Llava models 2024-07-24 22:28:30 +01:00
Jeremy Ruston
d39a3d61e3 Merge branch 'master' into feat-ai-tools 2024-07-24 22:05:24 +01:00
Jeremy Ruston
80fdaae6de Llamafile use native /completion API endpoint
So that we can do image analysis
2024-07-21 21:08:42 +01:00
Jeremy Ruston
4a79af9eea Revise default system prompt 2024-07-21 19:34:25 +01:00
Jeremy Ruston
370ff3057e Refactor completion servers so that they handle their own response 2024-07-21 16:51:19 +01:00
Jeremy Ruston
fb641d340c Fix an annoying little bug that prevents importvariables being used inside action-createtiddler in action strings
The root cause was that action-createtiddler widget was calling refreshChildren() with no argument.

A secondary factor was that importvariables widget was not defensive in handling a missing changedTiddlers parameter
2024-07-21 16:50:55 +01:00
Jeremy Ruston
3bdd449b3e Don't hardcode the API route 2024-07-21 16:11:46 +01:00
Jeremy Ruston
0037935af5 Revert "Give conversation tiddlers a dummy text field"
This reverts commit 0e5955397b.
2024-07-21 15:48:33 +01:00
Jeremy Ruston
dbb7e1c300 Merge branch 'master' into feat-ai-tools 2024-07-21 15:48:14 +01:00
Jeremy Ruston
0e5955397b Give conversation tiddlers a dummy text field
To avoid triggering a docs template
2024-07-19 14:51:18 +01:00
Jeremy Ruston
638bd78059 Formatting typo 2024-07-18 09:52:24 +01:00
Jeremy Ruston
d56958331b Docs tweaks 2024-07-18 09:49:33 +01:00
Jeremy Ruston
a2cff69fee Update docs 2024-07-18 09:24:37 +01:00
Jeremy Ruston
837374b5ab Don't try to parse plugins as conversations 2024-07-18 08:39:03 +01:00
Jeremy Ruston
d6f3058e9d Merge branch 'master' into feat-ai-tools 2024-07-18 08:34:21 +01:00
Jeremy Ruston
95f3e224b0 Merge branch 'master' into feat-ai-tools 2024-07-16 20:01:24 +01:00
Jeremy Ruston
a1782b1e4e Palette fixes 2024-07-16 19:41:44 +01:00
Jeremy Ruston
a921034561 Improved spinner colours 2024-07-14 21:27:52 +01:00
Jeremy Ruston
d652f820b8 Basic support for importing ChatGPT archives 2024-07-14 21:16:11 +01:00
Jeremy Ruston
e00c761088 Tweak default prompt 2024-07-11 15:02:30 +01:00
Jeremy Ruston
cb9deaa9b5 Update docs 2024-07-11 09:56:41 +01:00
Jeremy Ruston
3b07607d1b Fix Llamafile compatibility 2024-07-11 09:43:23 +01:00
Jeremy Ruston
2faba2e820 Initial Commit 2024-07-09 08:59:49 +01:00
186 changed files with 2525 additions and 1762 deletions

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

@@ -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);
@@ -2463,13 +2463,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

@@ -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

@@ -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

@@ -1,117 +0,0 @@
/*\
title: $:/core/modules/background-actions.js
type: application/javascript
module-type: global
Class to dispatch actions when filters change
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
function BackgroundActionDispatcher(filterTracker,wiki) {
var self = this;
this.filterTracker = filterTracker;
this.wiki = wiki;
this.nextTrackedFilterId = 1;
this.trackedFilters = Object.create(null); // Hashmap by id
// Track the filter for the background actions
this.filterTracker.track({
filterString: "[all[tiddlers+shadows]tag[$:/tags/BackgroundAction]!is[draft]]",
fnEnter: function fnEnter(title) {
return self.trackFilter(title);
},
fnLeave: function fnLeave(title,enterValue) {
self.untrackFilter(enterValue);
},
fnChange: function fnChange(title,enterValue) {
self.untrackFilter(enterValue);
return self.trackFilter(title);
},
fnProcess: function fnProcess(changes) {
self.process(changes);
}
});
}
BackgroundActionDispatcher.prototype.trackFilter = function(title) {
var tiddler = this.wiki.getTiddler(title),
id = this.nextTrackedFilterId++,
tracker = new BackgroundActionTracker({
wiki: this.wiki,
title: title,
trackFilter: tiddler.fields["track-filter"],
actions: tiddler.fields.text
});
this.trackedFilters[id] = tracker;
return id;
};
BackgroundActionDispatcher.prototype.untrackFilter = function(enterValue) {
var tracker = this.trackedFilters[enterValue];
if(tracker) {
tracker.destroy();
}
delete this.trackedFilters[enterValue];
};
BackgroundActionDispatcher.prototype.process = function(changes) {
for(var id in this.trackedFilters) {
this.trackedFilters[id].process(changes);
}
};
/*
Represents an individual tracked filter. Options include:
wiki: wiki to use
title: title of the tiddler being tracked
trackFilter: filter string to track changes
actions: actions to be executed when the filter changes
*/
function BackgroundActionTracker(options) {
var self = this;
this.wiki = options.wiki;
this.title = options.title;
this.trackFilter = options.trackFilter;
this.actions = options.actions
this.filterTracker = new $tw.FilterTracker(this.wiki);
this.hasChanged = false;
this.trackerID = this.filterTracker.track({
filterString: this.trackFilter,
fnEnter: function(title) {
self.hasChanged = true;
},
fnLeave: function(title,enterValue) {
self.hasChanged = true;
},
fnProcess: function(changes) {
if(self.hasChanged) {
self.hasChanged = false;
self.wiki.invokeActionString(
self.actions,
null,
{
title: self.title
},{
parentWidget: $tw.rootWidget
}
);
}
}
});
}
BackgroundActionTracker.prototype.process = function(changes) {
this.filterTracker.handleChangeEvent(changes);
};
BackgroundActionTracker.prototype.destroy = function() {
this.filterTracker.untrack(this.trackerID);
};
exports.BackgroundActionDispatcher = BackgroundActionDispatcher;
})();

View File

@@ -1,108 +0,0 @@
/*\
title: $:/core/modules/filter-tracker.js
type: application/javascript
module-type: global
Class to track the results of a filter string
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
function FilterTracker(wiki) {
this.wiki = wiki;
this.trackers = [];
this.nextTrackerId = 1;
}
FilterTracker.prototype.handleChangeEvent = function(changes) {
this.processTrackers();
this.processChanges(changes);
};
/*
Add a tracker to the filter tracker. Returns null if any of the parameters are invalid, or a tracker id if the tracker was added successfully. Options include:
filterString: the filter string to track
fnEnter: function to call when a title enters the filter results. Called even if the tiddler does not actually exist. Called as (title), and should return a truthy value that is stored in the tracker as the "enterValue"
fnLeave: function to call when a title leaves the filter results. Called as (title,enterValue)
fnChange: function to call when a tiddler changes in the filter results. Only called for filter results that identify a tiddler or shadow tiddler. Called as (title,enterValue), and may optionally return a replacement enterValue
fnProcess: function to call each time the tracker is processed, after any enter, leave or change functions are called. Called as (changes)
*/
FilterTracker.prototype.track = function(options) {
// Add the tracker details
var tracker = {
id: this.nextTrackerId++,
filterString: options.filterString,
fnEnter: options.fnEnter,
fnLeave: options.fnLeave,
fnChange: options.fnChange,
fnProcess: options.fnProcess,
previousResults: [], // Results from the previous time the tracker was processed
resultValues: {} // Map by title to the value returned by fnEnter
};
this.trackers.push(tracker);
// Process the tracker
this.processTracker(this.trackers.length - 1);
return tracker.id;
};
FilterTracker.prototype.untrack = function(id) {
for(var t=0; t<this.trackers.length; t++) {
if(this.trackers[t].id === id) {
this.trackers.splice(t,1);
break;
}
}
};
FilterTracker.prototype.processTrackers = function() {
for(var t=0; t<this.trackers.length; t++) {
this.processTracker(t);
}
};
FilterTracker.prototype.processTracker = function(index) {
var tracker = this.trackers[index];
var results = [];
// Evaluate the filter and remove duplicate results
$tw.utils.each(this.wiki.filterTiddlers(tracker.filterString),function(title) {
$tw.utils.pushTop(results,title);
});
// Process the newly entered results
$tw.utils.each(results,function(title) {
if(tracker.previousResults.indexOf(title) === -1 && !tracker.resultValues[title] && tracker.fnEnter) {
tracker.resultValues[title] = tracker.fnEnter(title) || true;
}
});
// Process the results that have just left
$tw.utils.each(tracker.previousResults,function(title) {
if(results.indexOf(title) === -1 && tracker.resultValues[title] && tracker.fnLeave) {
tracker.fnLeave(title,tracker.resultValues[title]);
delete tracker.resultValues[title];
}
});
// Update the previous results
tracker.previousResults = results;
};
FilterTracker.prototype.processChanges = function(changes) {
for(var t=0; t<this.trackers.length; t++) {
var tracker = this.trackers[t];
$tw.utils.each(changes,function(change,title) {
if(title && tracker.previousResults.indexOf(title) !== -1 && tracker.fnChange) {
// Call the change function and if it doesn't return a value then keep the old value
tracker.resultValues[title] = tracker.fnChange(title,tracker.resultValues[title]) || tracker.resultValues[title];
}
});
if(tracker.fnProcess) {
tracker.fnProcess(changes);
}
}
};
exports.FilterTracker = FilterTracker;
})();

View File

@@ -17,19 +17,24 @@ Export our filter function
*/
exports.function = function(source,operator,options) {
var functionName = operator.operands[0],
params = [];
params = [],
results;
$tw.utils.each(operator.operands.slice(1),function(param) {
params.push({value: param});
});
// console.log(`Calling ${functionName} with params ${JSON.stringify(params)}`);
var variableInfo = options.widget && options.widget.getVariableInfo && options.widget.getVariableInfo(functionName,{params: params, source: source});
if(variableInfo && variableInfo.srcVariable && variableInfo.srcVariable.isFunctionDefinition) {
return variableInfo.resultList ? variableInfo.resultList : [variableInfo.text];
results = variableInfo.resultList ? variableInfo.resultList : [variableInfo.text];
}
// Return the input list if the function wasn't found
var results = [];
source(function(tiddler,title) {
results.push(title);
});
if(!results) {
results = [];
source(function(tiddler,title) {
results.push(title);
});
}
// console.log(`function ${functionName} with params ${JSON.stringify(params)} results: ${JSON.stringify(results)}`);
return results;
};

View File

@@ -128,7 +128,7 @@ exports.minall = makeNumericReducingOperator(
exports.median = makeNumericArrayOperator(
function(values) {
var len = values.length, median;
values.sort();
values.sort(function(a,b) {return a-b});
if(len % 2) {
// Odd, return the middle number
median = values[(len - 1) / 2];

View File

@@ -1,72 +0,0 @@
/*\
title: $:/core/modules/info/mediaquerytracker.js
type: application/javascript
module-type: info
Initialise $:/info/ tiddlers derived from media queries via
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) {
if($tw.browser) {
// Functions to start and stop tracking a particular media query tracker tiddler
function track(title) {
var result = {},
tiddler = $tw.wiki.getTiddler(title);
if(tiddler) {
var mediaQuery = tiddler.fields["media-query"],
infoTiddler = tiddler.fields["info-tiddler"],
infoTiddlerAlt = tiddler.fields["info-tiddler-alt"];
if(mediaQuery && infoTiddler) {
// Evaluate and track the media query
result.mqList = window.matchMedia(mediaQuery);
function getResultTiddlers() {
var value = result.mqList.matches ? "yes" : "no",
tiddlers = [];
tiddlers.push({title: infoTiddler, text: value});
if(infoTiddlerAlt) {
tiddlers.push({title: infoTiddlerAlt, text: value})
}
return tiddlers;
};
updateInfoTiddlersCallback(getResultTiddlers());
result.handler = function(event) {
updateInfoTiddlersCallback(getResultTiddlers());
};
result.mqList.addEventListener("change",result.handler);
}
}
return result;
}
function untrack(enterValue) {
if(enterValue.mqList && enterValue.handler) {
enterValue.mqList.removeEventListener("change",enterValue.handler);
}
}
// Track media query tracker tiddlers
function fnEnter(title) {
return track(title);
}
function fnLeave(title,enterValue) {
untrack(enterValue);
}
function fnChange(title,enterValue) {
untrack(enterValue);
return track(title);
}
$tw.filterTracker.track({
filterString: "[all[tiddlers+shadows]tag[$:/tags/MediaQueryTracker]!is[draft]]",
fnEnter: fnEnter,
fnLeave: fnLeave,
fnChange: fnChange
});
}
return [];
};
})();

View File

@@ -36,6 +36,13 @@ exports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) {
// Screen size
infoTiddlerFields.push({title: "$:/info/browser/screen/width", text: window.screen.width.toString()});
infoTiddlerFields.push({title: "$:/info/browser/screen/height", text: window.screen.height.toString()});
// Dark mode through event listener on MediaQueryList
var mqList = window.matchMedia("(prefers-color-scheme: dark)"),
getDarkModeTiddler = function() {return {title: "$:/info/darkmode", text: mqList.matches ? "yes" : "no"};};
infoTiddlerFields.push(getDarkModeTiddler());
mqList.addListener(function(event) {
updateInfoTiddlersCallback([getDarkModeTiddler()]);
});
// Language
infoTiddlerFields.push({title: "$:/info/browser/language", text: navigator.language || ""});
}

View File

@@ -40,6 +40,7 @@ exports["image/gif"] = ImageParser;
exports["image/webp"] = ImageParser;
exports["image/heic"] = ImageParser;
exports["image/heif"] = ImageParser;
exports["image/avif"] = ImageParser;
exports["image/x-icon"] = ImageParser;
exports["image/vnd.microsoft.icon"] = ImageParser;

View File

@@ -46,8 +46,10 @@ function SaverHandler(options) {
// Filter the changes so that we only count changes to tiddlers that we care about
var filteredChanges = self.filterFn.call(self.wiki,function(iterator) {
$tw.utils.each(changes,function(change,title) {
var tiddler = self.wiki.getTiddler(title);
iterator(tiddler,title);
if(change.normal) {
var tiddler = self.wiki.getTiddler(title);
iterator(tiddler,title);
}
});
});
// Adjust the number of changes
@@ -183,7 +185,7 @@ SaverHandler.prototype.saveWiki = function(options) {
// Call the highest priority saver that supports this method
for(var t=this.savers.length-1; t>=0; t--) {
var saver = this.savers[t];
if(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {
if(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename, type: variables.type}})) {
this.logger.log("Saving wiki with method",method,"through saver",saver.info.name);
return true;
}

View File

@@ -22,6 +22,7 @@ DownloadSaver.prototype.save = function(text,method,callback,options) {
options = options || {};
// Get the current filename
var filename = options.variables.filename;
var type = options.variables.type;
if(!filename) {
var p = document.location.pathname.lastIndexOf("/");
if(p !== -1) {
@@ -32,13 +33,16 @@ DownloadSaver.prototype.save = function(text,method,callback,options) {
if(!filename) {
filename = "tiddlywiki.html";
}
if(!type) {
type = "text/html";
}
// Set up the link
var link = document.createElement("a");
if(Blob !== undefined) {
var blob = new Blob([text], {type: "text/html"});
var blob = new Blob([text], {type: type});
link.setAttribute("href", URL.createObjectURL(blob));
} else {
link.setAttribute("href","data:text/html," + encodeURIComponent(text));
link.setAttribute("href","data:" + type + "," + encodeURIComponent(text));
}
link.setAttribute("download",filename);
document.body.appendChild(link);

View File

@@ -16,9 +16,6 @@ Load core modules
exports.name = "load-modules";
exports.synchronous = true;
// Set to `true` to enable performance instrumentation
var PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE = "$:/config/Performance/Instrumentation";
exports.startup = function() {
// Load modules
$tw.modules.applyMethods("utils",$tw.utils);
@@ -38,19 +35,6 @@ exports.startup = function() {
$tw.macros = $tw.modules.getModulesByTypeAsHashmap("macro");
$tw.wiki.initParsers();
$tw.Commander.initCommands();
// --------------------------
// The rest of the startup process here is not strictly to do with loading modules, but are needed before other startup
// modules are executed. It is easier to put them here than to introduce a new startup module
// --------------------------
// Set up the performance framework
$tw.perf = new $tw.Performance($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,"no") === "yes");
// Kick off the filter tracker
$tw.filterTracker = new $tw.FilterTracker($tw.wiki);
$tw.wiki.addEventListener("change",function(changes) {
$tw.filterTracker.handleChangeEvent(changes);
});
// Kick off the background action dispatcher
$tw.backgroundActionDispatcher = new $tw.BackgroundActionDispatcher($tw.filterTracker,$tw.wiki);
};
})();

View File

@@ -75,7 +75,7 @@ exports.startup = function() {
$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]);
$tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title], true);
});
}
}

View File

@@ -77,8 +77,9 @@ exports.startup = function() {
$tw.rootWidget.addEventListener("tm-copy-to-clipboard",function(event) {
$tw.utils.copyToClipboard(event.param,{
successNotification: event.paramObject && event.paramObject.successNotification,
failureNotification: event.paramObject && event.paramObject.failureNotification
});
failureNotification: event.paramObject && event.paramObject.failureNotification,
plainText: event.paramObject && event.paramObject.plainText
},event.paramObject && event.paramObject.type);
});
// Install the tm-focus-selector message
$tw.rootWidget.addEventListener("tm-focus-selector",function(event) {

View File

@@ -17,6 +17,9 @@ exports.name = "startup";
exports.after = ["load-modules"];
exports.synchronous = true;
// Set to `true` to enable performance instrumentation
var PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE = "$:/config/Performance/Instrumentation";
var widget = require("$:/core/modules/widgets/widget.js");
exports.startup = function() {
@@ -54,6 +57,8 @@ exports.startup = function() {
}
// Initialise version
$tw.version = $tw.utils.extractVersionInfo();
// Set up the performance framework
$tw.perf = new $tw.Performance($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,"no") === "yes");
// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers
$tw.rootWidget = new widget.widget({
type: "widget",

View File

@@ -40,10 +40,10 @@ exports.getFieldString = function(field,defaultValue) {
};
/*
Get the value of a field as a list
Get the value of a field as an array / list
*/
exports.getFieldList = function(field) {
var value = this.fields[field];
var value = this.getFieldString(field,null);
// Check for a missing field
if(value === undefined || value === null) {
return [];

View File

@@ -268,9 +268,10 @@ exports.copyStyles = function(srcDomNode,dstDomNode) {
/*
Copy plain text to the clipboard on browsers that support it
*/
exports.copyToClipboard = function(text,options) {
options = options || {};
text = text || "";
exports.copyToClipboard = function(text,options,type) {
var text = text || "";
var options = options || {};
var type = type || "text/plain";
var textArea = document.createElement("textarea");
textArea.style.position = "fixed";
textArea.style.top = 0;
@@ -283,10 +284,16 @@ exports.copyToClipboard = function(text,options) {
textArea.style.outline = "none";
textArea.style.boxShadow = "none";
textArea.style.background = "transparent";
textArea.value = text;
document.body.appendChild(textArea);
textArea.select();
textArea.setSelectionRange(0,text.length);
textArea.addEventListener("copy",function(event) {
event.preventDefault();
if (options.plainText) {
event.clipboardData.setData("text/plain",options.plainText);
}
event.clipboardData.setData(type,text);
});
var succeeded = false;
try {
succeeded = document.execCommand("copy");

View File

@@ -216,11 +216,11 @@ HttpClientRequest.prototype.send = function(callback) {
if(lengthComputable) {
setBinding(self.bindProgress,"" + Math.floor((loaded/total) * 100))
}
self.wiki.invokeActionString(self.progressActions,undefined,{
self.wiki.invokeActionString(self.progressActions,undefined,$tw.utils.extend({},self.variables,{
lengthComputable: lengthComputable ? "yes" : "no",
loaded: loaded,
total: total
},{parentWidget: $tw.rootWidget});
}),{parentWidget: $tw.rootWidget});
}
});
}

View File

@@ -104,7 +104,7 @@ CreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {
}
this.setVariable("createTiddler-title",title);
this.setVariable("createTiddler-draftTitle",draftTitle);
this.refreshChildren();
this.refreshChildren([]);
return true; // Action was invoked
};

View File

@@ -157,7 +157,7 @@ CheckboxWidget.prototype.getValue = function() {
if(this.checkboxTag) {
return false;
}
if(this.checkboxField) {
if(this.checkboxField || this.checkboxIndex) {
if(this.checkboxDefault === this.checkboxChecked) {
return true;
}

View File

@@ -43,15 +43,6 @@ EditWidget.prototype.execute = function() {
// Get our parameters
this.editTitle = this.getAttribute("tiddler",this.getVariable("currentTiddler"));
this.editField = this.getAttribute("field","text");
this.editIndex = this.getAttribute("index");
this.editClass = this.getAttribute("class");
this.editPlaceholder = this.getAttribute("placeholder");
this.editTabIndex = this.getAttribute("tabindex");
this.editFocus = this.getAttribute("focus","");
this.editCancelPopups = this.getAttribute("cancelPopups","");
this.editInputActions = this.getAttribute("inputActions");
this.editRefreshTitle = this.getAttribute("refreshTitle");
this.editAutoComplete = this.getAttribute("autocomplete");
// Choose the appropriate edit widget
this.editorType = this.getEditorType();
// Make the child widgets
@@ -89,8 +80,8 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of
*/
EditWidget.prototype.refresh = function(changedTiddlers) {
var changedAttributes = this.computeAttributes();
// Refresh if an attribute has changed, or the type associated with the target tiddler has changed
if(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || (this.getEditorType() !== this.editorType)) {
// Refresh if the editor type has changed
if(changedAttributes.tiddler || changedAttributes.field || (this.getEditorType() !== this.editorType)) {
this.refreshSelf();
return true;
} else {

View File

@@ -24,6 +24,10 @@ Inherit from the base widget class
*/
FillWidget.prototype = new Widget();
FillWidget.prototype.execute = function() {
// Do nothing. Make no child widgets. $Fill widgets should be invisible when naturally encountered. Instead, their parseTreeNodes are made available to $slot widgets that want it.
};
exports.fill = FillWidget;
})();

View File

@@ -23,15 +23,21 @@ Inherit from the base widget class
*/
GenesisWidget.prototype = new Widget();
GenesisWidget.prototype.computeAttributes = function(options) {
options = options || Object.create(null);
options.filterFn = function(name) {
// Only compute our own attributes which start with a single dollar
return name.charAt(0) === "$" && name.charAt(1) !== "$";
}
return Widget.prototype.computeAttributes.call(this,options);
};
/*
Render this widget into the DOM
*/
GenesisWidget.prototype.render = function(parent,nextSibling) {
this.parentDomNode = parent;
this.computeAttributes({filterFn: function(name) {
// Only compute our own attributes which start with a single dollar
return name.charAt(0) === "$" && name.charAt(1) !== "$";
}});
this.computeAttributes();
this.execute();
this.renderChildren(parent,nextSibling);
};

View File

@@ -107,6 +107,7 @@ ImportVariablesWidget.prototype.execute = function(tiddlerList) {
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
*/
ImportVariablesWidget.prototype.refresh = function(changedTiddlers) {
changedTiddlers = changedTiddlers || {};
// Recompute our attributes and the filter list
var changedAttributes = this.computeAttributes(),
tiddlerList = this.wiki.filterTiddlers(this.getAttribute("filter"),this);

View File

@@ -141,12 +141,15 @@ This method should be called after the changes it describes have been made to th
title: Title of tiddler
isDeleted: defaults to false (meaning the tiddler has been created or modified),
true if the tiddler has been deleted
isShadow: defaults to false (meaning the change applies to the normal tiddler),
true if the tiddler being changed is a shadow tiddler
*/
exports.enqueueTiddlerEvent = function(title,isDeleted) {
exports.enqueueTiddlerEvent = function(title,isDeleted,isShadow) {
// Record the touch in the list of changed tiddlers
this.changedTiddlers = this.changedTiddlers || Object.create(null);
this.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);
this.changedTiddlers[title][isDeleted ? "deleted" : "modified"] = true;
this.changedTiddlers[title][isShadow ? "shadow" : "normal"] = true;
// Increment the change count
this.changeCount = this.changeCount || Object.create(null);
if($tw.utils.hop(this.changeCount,title)) {

View File

@@ -78,13 +78,13 @@ code-background: <<colour background>>
code-border: <<colour flexoki-tx>>
code-foreground: <<colour flexoki-tx>>
diff-delete-background: <<colour flexoki-re>>
diff-delete-foreground: <<colour flexoki-paper>>
diff-delete-foreground: <<colour flexoki-bg-2>>
diff-equal-background:
diff-equal-foreground: inherit
diff-insert-background: <<colour flexoki-gr>>
diff-insert-foreground: <<colour flexoki-paper>>
diff-insert-foreground: <<colour flexoki-bg-2>>
diff-invisible-background: <<colour flexoki-ye>>
diff-invisible-foreground: <<colour flexoki-paper>>
diff-invisible-foreground: <<colour flexoki-bg-2>>
dirty-indicator: <<colour flexoki-re>>
download-background: <<colour flexoki-cy-2>>
download-foreground: <<colour background>>
@@ -103,8 +103,8 @@ external-link-foreground-visited: <<colour flexoki-bl>>
external-link-foreground: <<colour flexoki-bl>>
footnote-target-background: <<colour flexoki-bg-2>>
foreground: #CECDC3
highlight-background: <<colour flexoki-cyan-950>>
highlight-foreground: <<colour flexoki-cyan-400>>
highlight-background: <<colour flexoki-yellow-900>>
highlight-foreground: inherit
menubar-background: <<colour primary>>
menubar-foreground: <<colour flexoki-paper>>
message-background: <<colour background>>

View File

@@ -105,7 +105,7 @@ external-link-foreground-visited: <<colour flexoki-bl>>
external-link-foreground: <<colour flexoki-bl>>
footnote-target-background: <<colour flexoki-bg-2>>
foreground: #100F0F
highlight-background: <<colour flexoki-cyan-050>>
highlight-background: <<colour flexoki-yellow-100>>
highlight-foreground: inherit
menubar-background: <<colour primary>>
menubar-foreground: <<colour flexoki-paper>>

View File

@@ -2,5 +2,6 @@ title: $:/core/templates/exporters/CsvFile
tags: $:/tags/Exporter
description: {{$:/language/Exporters/CsvFile}}
extension: .csv
file-type: text/csv
<$macrocall $name="csvtiddlers" filter=<<exportFilter>> format="quoted-comma-sep" $output="text/raw"/>

View File

@@ -2,5 +2,6 @@ title: $:/core/templates/exporters/JsonFile
tags: $:/tags/Exporter
description: {{$:/language/Exporters/JsonFile}}
extension: .json
file-type: application/json
<$macrocall $name="jsontiddlers" filter=<<exportFilter>> $output="text/raw"/>

View File

@@ -2,6 +2,7 @@ title: $:/core/templates/exporters/TidFile
tags: $:/tags/Exporter
description: {{$:/language/Exporters/TidFile}}
extension: .tid
file-type: text/vnd.tiddlywiki
condition: [<count>compare:lte[1]]
\define renderContent()

View File

@@ -5,6 +5,7 @@ description: {{$:/language/Buttons/AdvancedSearch/Hint}}
\whitespace trim
\procedure advanced-search-button(class)
\whitespace trim
<$button to="$:/AdvancedSearch" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=`$(tv-config-toolbar-class)$ $(class)$`>
<%if [<tv-config-toolbar-icons>match[yes]] %>
{{$:/core/images/advanced-search-button}}

View File

@@ -5,6 +5,7 @@ description: {{$:/language/Buttons/ControlPanel/Hint}}
\whitespace trim
\procedure control-panel-button(class)
\whitespace trim
<$button to="$:/ControlPanel" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=`$(tv-config-toolbar-class)$ $(class)$`>
<%if [<tv-config-toolbar-icons>match[yes]] %>
{{$:/core/images/options-button}}

View File

@@ -7,11 +7,7 @@ description: {{$:/language/Buttons/Language/Hint}}
<span class="tc-popup-keep">
<$button popup=<<qualify "$:/state/popup/language">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass="tc-selected">
<%if [<tv-config-toolbar-icons>match[yes]] %>
<span class="tc-image-button">
<$set name="languagePluginTitle" value={{$:/language}}>
<$image source=`$(languagePluginTitle)$/icon`/>
</$set>
</span>
{{$:/core/images/language}}
<%endif%>
<%if [<tv-config-toolbar-text>match[yes]] %>
<span class="tc-btn-text"><$text text={{$:/language/Buttons/Language/Caption}}/></span>

View File

@@ -5,6 +5,7 @@ description: {{$:/language/Buttons/Manager/Hint}}
\whitespace trim
\procedure manager-button(class)
\whitespace trim
<$button to="$:/Manager" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class=`$(tv-config-toolbar-class)$ $(class)$`>
<%if [<tv-config-toolbar-icons>match[yes]] %>
{{$:/core/images/list}}

View File

@@ -4,10 +4,17 @@ caption: {{$:/core/images/save-button-dynamic}} {{$:/language/Buttons/SaveWiki/C
description: {{$:/language/Buttons/SaveWiki/Hint}}
\whitespace trim
<$button tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>
\procedure saveActions()
<$wikify name="site-title" text={{$:/config/SaveWikiButton/Filename}}>
<$action-sendmessage $message="tm-save-wiki" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>
<$action-sendmessage $message="tm-save-wiki" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>
</$wikify>
\end
<$button actions=<<saveActions>>
tooltip={{$:/language/Buttons/SaveWiki/Hint}}
aria-label={{$:/language/Buttons/SaveWiki/Caption}}
class=<<tv-config-toolbar-class>>
>
<span class="tc-dirty-indicator">
<%if [<tv-config-toolbar-icons>match[yes]] %>
{{$:/core/images/save-button-dynamic}}

View File

@@ -5,6 +5,7 @@ description: {{$:/language/Buttons/TagManager/Hint}}
\whitespace trim
\procedure control-panel-button(class)
\whitespace trim
<$button to="$:/TagManager" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=`$(tv-config-toolbar-class)$ $(class)$`>
<%if [<tv-config-toolbar-icons>match[yes]] %>
{{$:/core/images/tag-button}}

View File

@@ -1,9 +0,0 @@
title: SampleBackgroundAction: Dark Mode
tags: $:/tags/BackgroundAction
track-filter: [{$:/info/browser/darkmode}]
<%if [{$:/info/browser/darkmode}match[no]] %>
<$action-setfield $tiddler="$:/palette" text="$:/palettes/Vanilla"/>
<%else%>
<$action-setfield $tiddler="$:/palette" text="$:/palettes/SolarizedDark"/>
<%endif%>

View File

@@ -1,15 +0,0 @@
title: SampleBackgroundAction: Story Change
tags: $:/tags/BackgroundAction
track-filter: [list[$:/StoryList]]
<$action-sendmessage $message="tm-notify" $param="SampleBackgroundAction: Story Change" list={{$:/StoryList!!list}}/>
Story List:
<ol>
<$list filter="[enlist<list>]">
<li>
<$text text=<<currentTiddler>>/>
</li>
</$list>
</ol>

View File

@@ -1,5 +0,0 @@
title: $:/core/wiki/config/MediaQueryTrackers/DarkLightPreferred
tags: $:/tags/MediaQueryTracker
media-query: (prefers-color-scheme: dark)
info-tiddler: $:/info/browser/darkmode
info-tiddler-alt: $:/info/darkmode

View File

@@ -1,25 +1,12 @@
title: $:/snippets/languageswitcher
\define flag-title()
$(languagePluginTitle)$/icon
\end
\whitespace trim
<$linkcatcher to="$:/language">
<div class="tc-chooser tc-language-chooser">
<$list filter="[[$:/languages/en-GB]] [plugin-type[language]sort[description]]">
<$set name="cls" filter="[all[current]field:title{$:/language}]" value="tc-chooser-item tc-chosen" emptyValue="tc-chooser-item"><div class=<<cls>>>
<$set name="cls" filter="[all[current]field:title{$:/language}]" value="tc-chooser-item tc-chosen" emptyValue="tc-chooser-item">
<div class=<<cls>> lang={{!!name}}>
<$link>
<span class="tc-image-button">
<$set name="languagePluginTitle" value=<<currentTiddler>>>
<$transclude subtiddler=<<flag-title>>>
<$list filter="[all[current]field:title[$:/languages/en-GB]]">
<$transclude tiddler="$:/languages/en-GB/icon"/>
</$list>
</$transclude>
</$set>
</span>
&#32;
<$view field="description">
<$view field="name">
<$view field="title"/>

View File

@@ -3,9 +3,11 @@ tags: $:/tags/Macro
\whitespace trim
\procedure copy-to-clipboard(src,class:"tc-btn-invisible",style)
<$button message="tm-copy-to-clipboard"
param=<<src>>
\procedure copy-to-clipboard(src,class:"tc-btn-invisible",style,type:"text/plain",plain)
\procedure copy-to-clipboard-actions()
<$action-sendmessage $message="tm-copy-to-clipboard" $param=<<src>> type=<<type>> plainText=<<plain>>/>
\end copy-to-clipboard-actions
<$button actions=<<copy-to-clipboard-actions>>
class=<<class>>
style=<<style>>
tooltip={{$:/language/Buttons/CopyToClipboard/Hint}}
@@ -15,12 +17,12 @@ tags: $:/tags/Macro
<$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>
</span>
</$button>
\end
\end copy-to-clipboard
\procedure copy-to-clipboard-above-right(src,class:"tc-btn-invisible",style)
<div style="position: relative;">
<div style="position: absolute; bottom: 0; right: 0;">
<$macrocall $name="copy-to-clipboard" src=<<src>> class=<<class>> style=<<style>>/>
\procedure copy-to-clipboard-above-right(src,class:"tc-btn-invisible",style,type:"text/plain")
<div style.position="relative">
<div style.position="absolute" style.bottom="0" style.right="0">
<$transclude $variable="copy-to-clipboard" src=<<src>> class=<<class>> style=<<style>> type=<<type>> plain=<<plain>>/>
</div>
</div>
\end

View File

@@ -39,6 +39,7 @@ tags: $:/tags/Macro
$param=<<currentTiddler>>
exportFilter=<<exportFilter>>
filename={{{ [<baseFilename>addsuffix{!!extension}] }}}
type={{!!file-type}}
/>
<$action-deletetiddler $tiddler=<<qualify "$:/state/popup/export">>/>
<$transclude field="description"/>

View File

@@ -102,7 +102,11 @@ tags: $:/tags/Macro
<$genesis $type=<<elementTag>>>
<$transclude tiddler=<<itemTemplate>>>
<$link to={{!!title}}>
<$view field="title"/>
<$let tv-wikilinks="no">
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$let>
</$link>
</$transclude>
</$genesis>

View File

@@ -1,7 +1,6 @@
title: $:/core/macros/toc
tags: $:/tags/Macro
\define toc-open-icon() $:/core/images/down-arrow
\define toc-closed-icon() $:/core/images/right-arrow
@@ -121,7 +120,7 @@ tags: $:/tags/Macro
<$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item-selected" value="toc-item" >
<li class=<<toc-item-class>>>
<$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>
<$list filter="[all[current]tagging[]$sort$limit[1]] -[subfilter<__exclude__>]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>">
<$list filter="[all[current]tagging[]$sort$] -[subfilter<__exclude__>] +[limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>">
<$reveal type="nomatch" stateTitle=<<toc-state>> text="open">
<$button setTitle=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep">
<$transclude tiddler=<<toc-closed-icon>> />
@@ -148,7 +147,7 @@ tags: $:/tags/Macro
<$qualify name="toc-state" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>
<$set name="toc-item-class" filter=<<__itemClassFilter__>> emptyValue="toc-item-selected" value="toc-item">
<li class=<<toc-item-class>>>
<$list filter="[all[current]tagging[]$sort$limit[1]] -[subfilter<__exclude__>]" variable="ignore" emptyMessage="""<$button class="tc-btn-invisible">{{$:/core/images/blank}}</$button><span class="toc-item-muted"><<toc-caption>></span>""">
<$list filter="[all[current]tagging[]$sort$] -[subfilter<__exclude__>] +[limit[1]]" variable="ignore" emptyMessage="""<$button class="tc-btn-invisible">{{$:/core/images/blank}}</$button><span class="toc-item-muted"><<toc-caption>></span>""">
<$reveal type="nomatch" stateTitle=<<toc-state>> text="open">
<$button setTitle=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep">
<$transclude tiddler=<<toc-closed-icon>> />

View File

@@ -3,7 +3,7 @@ title: $:/snippets/paletteswitcher
\whitespace trim
<$linkcatcher to="$:/palette">
<div class="tc-chooser">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/Palette]!is[draft]sort[name]]">
<$set name="cls" filter="[all[current]prefix{$:/palette}]" value="tc-chooser-item tc-chosen" emptyValue="tc-chooser-item">
<div class=<<cls>>>
<$link to={{!!title}}>

View File

@@ -1,33 +1,9 @@
title: Translations
\define flag-title()
$(languagePluginTitle)$/icon
\end
TiddlyWiki is currently available in <$count filter="[[$:/languages/en-GB]] [plugin-type[language]sort[title]] -[[$:/languages/de-AT]]"/> languages:
<div class="tc-drop-down-language-chooser" style="font-size: 7px; line-height: 8px; -moz-columns:6; -webkit-columns:6; columns:6;">
<$list filter="[[$:/languages/en-GB]] [plugin-type[language]sort[title]] -[[$:/languages/de-AT]]">
<div class="tc-language-list">
<span class="tc-language-list-name tc-image-button">
<$set name="languagePluginTitle" value=<<currentTiddler>>>
<$transclude subtiddler=<<flag-title>>>
<$list filter="[all[current]field:title[$:/languages/en-GB]]">
<$transclude tiddler="$:/languages/en-GB/icon"/>
</$list>
</$transclude>
</$set>
<$view field="description">
<$view field="name">
<$view field="title"/>
</$view>
</$view>
<$view subtiddler="$:/language/ControlPanel/Basics/Language/Prompt">
<$view tiddler="$:/language/ControlPanel/Basics/Language/Prompt"/>
</$view>
</span>
</div>
</$list>
<div style.height="400px" style.overflowY="auto">
{{$:/snippets/languageswitcher}}
</div>
Find out how to [[Get Started]].

View File

@@ -25,6 +25,7 @@
"de-DE",
"el-GR",
"en-US",
"en-PH",
"es-ES",
"fa-IR",
"fr-FR",
@@ -34,12 +35,15 @@
"it-IT",
"ja-JP",
"ko-KR",
"mk-MK",
"nl-NL",
"pa-IN",
"pl-PL",
"pt-BR",
"pt-PT",
"ru-RU",
"sk-SK",
"sl-SI",
"sv-SE",
"zh-CN",
"zh-Hans",

View File

@@ -0,0 +1,24 @@
created: 20180626122427188
modified: 20241228111603066
original-modified: 20211117234223960
tags: [[TiddlyWiki on Node.js]]
title: NamedCommandParameters
ja-title: 名前付きコマンドパラメータ
type: text/vnd.tiddlywiki
<<.from-version "5.1.18">> ほとんどのTiddlyWiki[[コマンド|Commands]]は、パラメータに位置に基づくシステムを使用しており、各パラメータはコマンドで定義された正確な順序でリストされる必要があります。より複雑なコマンドの中には、名前付きコマンドパラメータの代替スキームを提供するものもあります。たとえば、ここでは"port"と"host"という2つのパラメータを提供します:
```
--listen port=8090 host=0.0.0.0
```
パラメータの順序は重要ではないことに注意してください。
パラメータ内で特殊文字を使用するには引用符が必要です。Unix、Linux、Macではシングルクォートが使用され、Windowsではダブルクォートが使用されます:
```
--listen port=8090 username=joe 'password=s3cret(!'
--listen port=8090 username=joe "password=s3cret(!"
```
引用符は値の部分だけでなく、名前=値のペア全体を括ることに注意してください。

View File

@@ -0,0 +1,42 @@
created: 20130825214200000
modified: 20250203103623306
original-modified: 20161015134454785
tags: [[TiddlyWiki on Node.js]]
title: TiddlyWikiFolders
ja-title: TiddlyWikiフォルダ
type: text/vnd.tiddlywiki
[[Node.js上のTiddlyWiki|TiddlyWiki on Node.js]]は、従来の単一ファイルWikiと同様に、フォルダーに保存される個々のTiddlerファイルのWikiもサポートします。
! Wikiフォルダ構造
Wikiフォルダーには、次のファイルとフォルダーを含めることができます:
* ''tiddlywiki.info'' - Wikiのメタデータを含むJSONファイル -- [[tiddlywiki.infoファイル|tiddlywiki.info Files]]を参照
* ''\tiddlers'' - Wikiを構成するTiddlerファイルを含むフォルダ
* ''\plugins'' - Wikiに含める[[プラグインフォルダ|PluginFolders]]を含むフォルダ
* ''\languages'' - Wikiに含める言語プラグインの[[プラグインフォルダ|PluginFolders]]を含むフォルダ
* ''\themes'' - Wikiに含めるテーマプラグインの[[プラグインフォルダ|PluginFolders]]を含むフォルダ
''tiddlywiki.info''ファイルのみが必須で、その他はすべてオプションです。上記にリストされていないファイルとフォルダーは無視されます。
!! プラグイン処理
ブラウザで使用できるようにするには、プラグインをWikiに含める必要があります。サーバー上で生成されるWikiの場合、[[TiddlyWikiフォルダ|TiddlyWikiFolders]]には、このWikiに含めるプラグインの識別を[[tiddlywiki.infoファイル|tiddlywiki.info Files]]に含めることができます:
```
{
"plugins": [
"tiddlywiki/slider",
"tiddlytools/chooser"
]
}
```
プラグイン名は、TiddlyWiki5のルート`plugins`フォルダーにリストされているプラグインフォルダーを参照します。プラグインは、Wikiの`plugins`サブフォルダーにコピーして手動で含めることもできます。
!! `tiddlers`フォルダの処理
`tiddlers`フォルダー内のすべての[[Tiddlerファイル|TiddlerFiles]]は、起動時にWikiに読み込まれます。サブフォルダーは[[Tiddlerファイル|TiddlerFiles]]の再帰スキャンの対象となります。新しく作成されたTiddlerは、[[特に設定されて|Customising Tiddler File Naming]]いない限り、`tiddlers`フォルダーの直下の[[Tiddlerファイル|TiddlerFiles]]に保存されます。
`tiddlers`フォルダー内のサブフォルダーのデフォルトの処理は、`tiddlywiki.files`と呼ばれるJSONファイルを提供することで上書きできます -- [[tiddlywiki.filesファイル|tiddlywiki.files Files]]を参照。

View File

@@ -0,0 +1,21 @@
created: 20140126125259638
modified: 20241227104451970
original-modified: 20171118195316103
tags: Definitions Platforms
title: TiddlyDesktop
ja-title: TiddlyDesktop
type: text/vnd.tiddlywiki
TiddlyDesktopは、TiddlyWikiファイル(TiddlyWikiClassicとTiddlyWikiバージョン5の両方)を操作するためのアプリです。Windowsや、Mac OS X、Linuxにインストールできます。TiddlyWikiバージョン5と古いTiddlyWikiClassicと互換性があります
{{Saving on TiddlyDesktop}}
{{Introducing TiddlyDesktop Video}}
! ソース
TiddlyDesktopは、[[オープンソース|OpenSource]]プロジェクト[[NW.js]]をベースにしています。ソースはGitHubにあります:
https://github.com/TiddlyWiki/TiddlyDesktop/
[[TiddlyDesktopのリリース|TiddlyDesktop Releases]]と[[TiddlyDesktopのカスタマイズ方法|How to Customize TiddlyDesktop]]を参照してください

View File

@@ -0,0 +1,31 @@
created: 20150621181334837
modified: 20250124111732489
original-modified: 20150621181400844
tags: [[TiddlyWiki on Node.js]]
title: MultiTiddlerFileSyntax
ja-title: マルチTiddlerファイル構文
type: text/vnd.tiddlywiki
!!! [[マルチTiddlerファイル|MultiTiddlerFiles]]
<$railroad text="""
{<"ヘッダー行">} "空行" {(<"Tiddler記述行"> | <"コメント行">)}
"""/>
!!! ヘッダー行
<$railroad text="""
<"識別子"> ":" {"ホワイトスペース"} <"値"> "改行"
"""/>
!!! Tiddler記述行
<$railroad text="""
<"ファイルパス"> ":" {"ホワイトスペース"} <"Tiddlerタイトル"> "改行"
"""/>
!!! コメント行
<$railroad text="""
"#" {("テキスト" | "ホワイトスペース")} "改行"
"""/>

View File

@@ -0,0 +1,38 @@
created: 20140209143652456
modified: 20250123115055695
original-modified: 20150621182140407
tags: [[TiddlyWiki on Node.js]]
title: MultiTiddlerFiles
ja-title: マルチTiddlerファイル
type: text/vnd.tiddlywiki
MultiTiddlerFilesを使用すると、複数のTiddlerを1つのテキストファイルに簡潔に表現できます。
この形式の目標は次のとおりです:
* 入力しやすく、読みやすい
* 単一行の文字列に最適化
* Tiddlerのグループ内で共通のフィールドやタグを共有できるようにする
* 外部ツールで簡単に処理できるようにする
MultiTiddlerFilesの拡張子は`multids`です。ファイルは、共有フィールドのブロックとそれに続く空白行で構成されます。ファイルの残りの部分は、コメントとTiddlerのシーケンスです。Tiddlerはタイトルで指定され、その後にコロン、少なくとも1つのスペース文字が続き、行の残りの部分はTiddlerのテキストフィールドになります。
例:
```
title: $:/language/ControlPanel/
tags: strings
modifier: JoeBloggs
Basics/Caption: Basics
# This is a comment
Basics/Version: ~TiddlyWiki Version
```
この例では、[[$:/language/ControlPanel/Basics/Caption]]と[[$:/language/ControlPanel/Basics/Version]]の2つのTiddlerを定義します。
ヘッダーで`title`フィールドが指定されている場合、タイトルで定義された個々のTiddlerのプレフィックスとして扱われます。
!! 構文の仕様
{{MultiTiddlerFileSyntax}}

View File

@@ -0,0 +1,112 @@
created: 20130825150000000
modified: 20250125105846987
original-modified: 20210714130751701
tags: [[TiddlyWiki on Node.js]]
title: TiddlerFiles
ja-title: Tiddlerファイル
type: text/vnd.tiddlywiki
Tiddlerは、さまざまな形式でテキストファイルに保存できます。単一のTiddlerを含むファイルには、名前:値のペアのシーケンスとしてフォーマットされた`.meta`補助ファイルを持つこともできます。
```
title: TheTitle
modifier: someone
```
!! ~TiddlyWebスタイルの.tidファイル
これらのファイルは、名前:値のペア、空白行、そしてTiddlerのテキストを含む一連の行で構成されます。例:
```
title: MyTiddler
modifier: Jeremy
This is the text of my tiddler.
```
多くのテキストエディターでは、ファイルに終了改行が含まれている必要があることに注意してください。Tiddlerのテキストに終了改行を含めたくない場合は、次の代替構文を使用できます:
```
title: MyTiddler
modifier: Jeremy
text: This is the text of my tiddler.
```
//`application/x-tiddler` ContentTypeはこれらのファイルの内部で使用されます//
!! TiddlyWiki `<DIV>` .tiddlerファイル
TiddlyWiki 5では、`*.tiddler`ファイルは次のようになります。
```
<div title="AnotherExampleStyleSheet" modifier="blaine" created="201102111106" modified="201102111310" tags="examples" creator="psd">
<pre>Note that there is an embedded <pre> tag, and line feeds are not escaped.
And, weirdly, there is no HTML encoding of the body.</pre>
</div>
```
これらの`*.tiddler`ファイルは、HTML エンコードされたTiddlyWiki HTMLファイル内のTiddlerとまったく同じではありません。
Older `*.tiddler` files more closely matched the store format used by TiddlyWiki at the time:
古い`*.tiddler`ファイルは、当時TiddlyWikiで使用されていたストア形式に似ています:
```
<div tiddler="AnotherExampleStyleSheet" modifier="JeremyRuston" modified="200508181432" created="200508181432" tags="examples">This is an old-school .tiddler file, without an embedded &lt;pre&gt; tag.\nNote how the body is &quot;HTML encoded&quot; and new lines are escaped to \\n</div>
```
//`application/x-tiddler-html-div` ContentTypeはこれらのファイルの内部で使用されます//
!! ~TiddlyWebスタイルのJSONファイル
これらのファイルは、`name:value`プロパティのハッシュマップの単純な配列です。すべてのフィールド値は文字列として指定する必要があります。
例:
```
[
{
"title": "First Tiddler",
"text": "Text of first tiddler",
"tags": "one two [[t h r e e]]"
},{
"title": "Second Tiddler",
"text": "Text of second tiddler",
"modified": "20150216171751154"
}
]
```
`application/json` ContentTypeはこれらのファイルに対して内部で使用されます。
Tiddler構造に準拠していないJSONファイルは、代わりにJSONデータを含む単一のTiddlerとしてインポートされることに注意してください。
!! TiddlyWiki HTMLファイル用の新しいJSONベースの形式
TiddlyWiki HTMLファイルの新しい形式では、スクリプトタグ内にJSON形式のTiddlerが埋め込まれます:
```json
<script class="tiddlywiki-tiddler-store" type="application/json">[
{"title": "A","text": "One"},
{"title": "B","text": "Two"}
]</script>
```
!! TiddlyWiki HTMLファイル用の古いDIVベースの形式
TiddlyWikiクラシックおよびバージョンv5.2.0より前のTiddlyWiki 5では、Tiddlerは`<DIV>`形式でエンコードされて保存されていました。
TiddlyWikiが暗号化されていないDIVベースのHTMLファイルをインポートするには、上で説明したようにTiddler DIVを含んだ`<div id="storeArea">`が必要です。例:
```
<div id="storeArea">
<div created="20130302085406905" modified="20130302084548184" tags="Examples" title="A tiddler title">
<pre>HTML encoded text of tiddler
</pre>
</div>
<div created="20140315085406905" modified="20140321084548184" tags="One Two [[Three with Space]]" title="Another title" customfield="field value">
<pre>Text of this tiddler
</pre>
</div>
</div>
```

View File

@@ -0,0 +1,37 @@
created: 20130828190200000
modified: 20250120105549696
original-modified: 20241008031135403
tags: [[TiddlyWiki on Node.js]]
title: Generating Static Sites with TiddlyWiki
ja-title: TiddlyWikiで静的サイトを生成する
type: text/vnd.tiddlywiki
TiddlyWiki5は、JavaScriptを必要としないTiddlyWikiの静的HTML表現を生成できます。このプロセスでは、ローカルシステムのNode.jsにTiddlyWikiがインストールされている必要があります。詳細については、[[Node.jsにTiddlyWikiをインストールする|Installing TiddlyWiki on Node.js]]を参照してください。
静的HTMLの生成方法には多くの柔軟性があります。次のシナリオはすべて https://tiddlywiki.com で説明されています。
! WikiスナップショットとTiddlerスナップショット
https://tiddlywiki.com/static.html で、メインのTiddlyWikiサイトの静的な表現を見ることができます。このファイルは、現在のDefaultTiddlersの静的スナップショットです。このファイルにリンクされているすべてのTiddlerは、個々のTiddlerの静的スナップショットを指す`/static/HelloThere.html`形式のURLによって参照されます。TiddlerのHTMLファイルは、`static.css`スタイルシートファイルを参照します。
次のコマンドは、TiddlyWiki5サイトの静的バージョンのサンプルを生成するために使用されます:
```sh
tiddlywiki wikipath --render '[!is[system]]' '[encodeuricomponent[]addprefix[static/]addsuffix[.html]]' text/plain $:/core/templates/static.tiddler.html
tiddlywiki wikipath --render $:/core/templates/static.template.html static.html text/plain
tiddlywiki wikipath --render $:/core/templates/static.template.css static/static.css text/plain
```
最初のRenderCommandは、フィルタ`[!is[system]]`を使用してすべての個別の非システムTiddlerのHTML表現を生成し、次のフィルタ`[encodeuricomponent[]addprefix[static/]addsufixx[.html]]`は各タイトルにURIエンコーディングを適用し、プレフィックス`static/`を追加して、最後にサフィックス`.html`を追加します。2番目のRenderCommandは、DefaultTiddlersの静的バージョンを`static.html`に保存し、最後のRenderCommandはスタイルシートを保存します。(すべてのファイルは、Wikiフォルダの`output`フォルダに配置されます)。
! 内部リンク付きWikiスナップショット
Tiddlerの静的表現を含み、標準のHTMLアンカーリンクを使用してそれらの間を移動する単一のHTMLファイルを作成することも可能です。
例: https://tiddlywiki.com/alltiddlers.html
この例は次のコマンドによって構築できます:
```
--render $:/core/templates/alltiddlers.template.html alltiddlers.html text/plain
```

View File

@@ -0,0 +1,19 @@
created: 20131124220600000
modified: 20250121112457196
original-modified: 20241025051111864
tags: [[TiddlyWiki on Node.js]]
title: How to build a TiddlyWiki5 from individual tiddlers
ja-title: 個々のTiddlerからTiddlyWiki5を構築する方法
type: text/vnd.tiddlywiki
まず、[[Node.jsにTiddlyWikiをインストール|Installing TiddlyWiki on Node.js]]の説明に従ってTiddlyWikiをインストールします。
# 空の[[TiddlyWikiFolder|TiddlyWikiFolders]]を作成します
## 適当な場所に新しいフォルダを作成します (例: `~/MyWiki`)
## 次のテキストを含む`tiddlywiki.info`というファイルを作成します:
##* `{"themes": ["tiddlywiki/vanilla","tiddlywiki/snowwhite"]}`
## `tiddlers`というサブフォルダを作成します
##* あるいは、TiddlyWiki5リポジトリから、`editions/empty`フォルダをコピーします
# `~/MyWiki/tiddlers`ディレクトリ内に個々のTiddlerFilesを作成します
# TiddlyWiki5ルートディレクトリから次のコマンドを実行して、TiddlerからTiddlyWiki5ファイルを構築します:
## `tiddlywiki ~/MyWiki --render $:/core/save/all index.html text/plain`

View File

@@ -0,0 +1,31 @@
created: 20130825150100000
modified: 20250204104525288
original-modified: 20140912141559011
tags: [[TiddlyWiki on Node.js]]
title: Using TiddlyWiki for GitHub project documentation
ja-title: GitHubプロジェクトのドキュメントにTiddlyWikiを使用する
type: text/vnd.tiddlywiki
TiddlyWiki5は、GitHubプロジェクトのドキュメントを作成するために使用できます。ソースコード管理下にある個別のTiddlerファイルを含む[[TiddlyWikiフォルダ|TiddlyWikiFolders]]として単一のドキュメントセットを維持し、それを使用してプロジェクトフォルダーに含める`readme.md`ファイルや[[GitHub Pages|http://pages.github.com/]]に保存するHTMLファイルを作成できます。両方の機能は、TiddlyWiki5自身によって実証されています。
! `readme.md`ファイルの生成
フォルダーの内容を表示する際、GitHubは`readme.md`ファイルを探して表示します。この方法では完全なHTMLファイルではなく、静的なMarkDownファイルのみが表示されることに注意してください(これはセキュリティ対策です)。幸いなことに、MarkDownはHTMLの安全なサブセットを許可しているため、GitHubに適した`readme.md`ファイルを生成するには、TiddlyWiki5がHTMLドキュメントの`<body>`要素の内容を生成し、適切なファイル名を付けるだけで済みます。
これは次のコマンドで実行できます:
```
--rendertiddler ReadMe ./readme.md text/html
```
ReadMe Tiddlerを`text/html`形式でファイル`./readme.md`に保存します。
デフォルトでは、Tiddlerのリンクは、Tiddlerのタイトルで構成される相対URIへのリンクとしてレンダリングされます。この動作は、ReadMe Tiddlerの先頭で行われているように、マクロ`tv-wikilink-template`を定義することで上書きできます
```
\define tv-wikilink-template() https://tiddlywiki.com/static/$uri_doubleencoded$.html
```
詳細については、LinkWidgetを参照してください。
この例では、Tiddlerのリンクはtw5.comの静的レンダリングへのリンクとしてレンダリングされます。

View File

@@ -0,0 +1,16 @@
created: 20140613133627669
modified: 20241230102718926
original-modified: 20140912141613393
tags: [[TiddlyWiki on Node.js]]
title: Using a custom path prefix with the client-server edition
ja-title: クライアント-サーバーエディションでカスタムのパスプレフィックスを使用する
type: text/vnd.tiddlywiki
デフォルトでは、[[Node.js上のTiddlyWiki|TiddlyWiki on Node.js]]を実行すると、サーバーはプロトコル、ホスト、ポートから形成されたURI - 例えば、`http://127.0.0.1:8080/`でWikiを公開します。
`http://127.0.0.1:8080/path/to/my/wiki/`のようなカスタムパスでWikiを実行するには、2つの手順があります:
# ServerCommandの''pathprefix''属性として`/path/to/my/wiki`を渡してサーバーを設定します
# `$protocol$//$host$/path/to/my/wiki/`を含む、`$:/config/tiddlyweb/host`というTiddlerを作成してクライアントを設定します

View File

@@ -1,27 +0,0 @@
created: 20151231083708980
modified: 20241221105811581
original-modified: 20211117212723856
tags: Languages
title: LanguageGallery Example
ja-title: 言語ギャラリー
type: text/vnd.tiddlywiki
これは、ListWidgetとTranscludeWidgetを使用して、<<tag Language>>と<<tag Icon>>の[[タグ付け|Tagging]]された言語アイコンすべてをグリッド表示する例です。
<style>
.language-gallery img {
width: 5em;
height: auto;
margin: 0.5em;
-webkit-box-shadow: 2px 2px 5px rgba(0,0,0,0.2);
-moz-box-shadow: 2px 2px 5px rgba(0,0,0,0.2);
box-shadow: 2px 2px 5px rgba(0,0,0,0.2);
}
</style>
<div class="language-gallery">
<$list filter="[all[tiddlers+shadows]tag[Language]tag[Icon]]">
<span title=<<currentTiddler>>>
<$transclude/>
</span>
</$list>
</div>

View File

@@ -0,0 +1,27 @@
created: 20131129094452285
modified: 20241227110457591
original-modified: 20140912141658212
tags: [[TiddlyWiki on Node.js]]
title: Building TiddlyWikiClassic
ja-title: TiddlyWikiClassicの構築
type: text/vnd.tiddlywiki
TiddlyWiki5を使用すれば、TiddlyWikiClassicの古いバージョン2.xxをその構成コンポーネントから構築できます。これには次の機能が含まれます:
* `tiddlywiki/classictools`プラグインには、TiddlyWiki 2.xxの`.recipe`ファイルからTiddlerをロードできるようにするデシリアライザモジュールが含まれています
* ViewWidgetのための`stripcomments`フォーマットは、`//#`で始まる1行のJavaScriptコメントを削除します
* FieldsWidgetの`stripTitlePrefix='yes'`属性は、`title`属性から中括弧で囲まれたプレフィックスを削除します
** 例えば、`{tiddler}HelloThere`は、`HelloThere`に変換されます
! 使用法
TiddlyWikiClassicは、[[Node.js上のTiddlyWiki|TiddlyWiki on Node.js]]を実行することによってコマンドラインから構築されます。一般的な使用法は次のようになります:
```
node ../../tiddlywiki.js \
--verbose \
--load <path_to_recipe_file> \
--rendertiddler $:/core/templates/tiddlywiki2.template.html <path_to_write_index_file> text/plain \
|| exit 1
```

View File

@@ -0,0 +1,58 @@
created: 20160424181300000
modified: 20241230104855826
original-modified: 20210803204659026
tags: [[TiddlyWiki on Node.js]]
title: Customising Tiddler File Naming
ja-title: Tiddlerファイル名のカスタマイズ
type: text/vnd.tiddlywiki
デフォルトでは、[[Wikiフォルダー|TiddlyWikiFolders]]を使用する[[Node.js上のTiddlyWiki|TiddlyWiki on Node.js]]インスタンスは、サニタイズされ、曖昧さが解消されたタイトルをファイル名として使用して、新しいTiddlerファイルを作成します。すべてのファイルパス操作は、`default-tiddler-location`からの相対で、デフォルトではWikiフォルダーの`tiddlers/`ディレクトリです。`config`オブジェクトの`default-tiddler-location`プロパティを使用して、Wikiのtiddlywiki.infoファイル内のパスをマッピングすることで、これを上書きできます。
デフォルトのファイル拡張子`.tid`は、`type`フィールドが欠落しているTiddlerや、"text/vnd.tiddlywiki"タイプが"text/vnd.tiddlywiki"のTiddlerに使用されます。他のタイプのTiddlerは、(ブートスタートアップ時に定義される)MIMEタイプに従って保存されます。
オプションのTiddler[[$:/config/FileSystemPaths]]と[[$:/config/FileSystemExtensions]]を作成することにより、論理パス(ディレクトリとファイル名)とファイル拡張子を個別にカスタマイズできます。
! ファイルシステムパス
論理パスは、1つ以上の[[フィルター式|Filter Syntax]](各フィルター式は1行に1つずつ)を含む[[$:/config/FileSystemPaths]] Tiddlerを作成することでカスタマイズできます。Tiddlerがディスクに保存されるたびに、各フィルターが順番にテストされ、出力を生成する最初のフィルターの最初の出力が、Tiddlerファイルに使用される論理パスとして取得されます。論理パスが変更された場合は、新しいファイルが作成され、古いファイルは削除されます。
Tiddlerは、[[Wikiフォルダ|TiddlyWikiFolders]]、`default-tiddler-location`設定で定義されたパス、または $:/config/OriginalTiddlerPaths Tiddlerに保存された特定のパス([[tiddlywiki.filesファイル|tiddlywiki.files Files]]を参照)にのみ書き込むことができます。Tiddlerをディスクに保存するときに、論理パスがWikiフォルダのパスで始まらない(最も一般的なエラー)と、ファイルパスがJavascriptの`encodeURIComponent()`メソッドによってエンコードされ、Wikiフォルダの`default-tiddler-location`にTiddlerがファイルとして保存されます。
論理パスにはディスク上のファイルの拡張子は含まれません(下記参照)。また、ディレクトリ区切り文字として`/`や`\`を使用できます(物理パスを生成するときに、~TiddlyWikiが動作しているプラットフォームの正しい区切り文字に置き換えられます)。フィルターがどれも一致しない場合、論理パスは、結果のパスがすべてのサポートされているプラ​​ットフォームで有効であることを保証するため、すべての`/\<>~:"|?*^`文字が`_`に置き換えられたタイトルになります。論理パスも200文字に制限されています。この名前のファイルがすでに存在する場合、スペースと数字が最終的なファイルパスに追加され、未使用のパスが見つかるまで数字が増加していきます。
!! 例
```
[is[system]!has[draft.of]removeprefix[$:/]addprefix[_system/]]
[is[draft]search-replace:g:regexp[/|\\],[_]addprefix[drafts/]]
[tag[task]addprefix[mytasks/]]
[!tag[externalnote]addprefix[wiki/]]
```
<<.note "すべてのパスはWikiの`default-tiddler-location`からの相対パスです。">>
これにより、他のTiddlerの下書きではない、新しく作成されたシステムTiddlerが`./_system/`(`$:/`プレフィックスの削除後)に保存されます。次に、すべての下書きのタイトルのパス区切り文字が"_"に置き換えられ、`./drafts/`に保存されます。そして、[[task]]タグが付けられたTiddlerがサブディレクトリ`./mytasks/`に保存されます。最後に、"externalnote"タグが付けられていないすべてのTiddlerが最終的に`[!tag[externalnote]addprefix[wiki/]]`に一致し、これらが`./wiki/`に保存されます。この例では、"externalnote"タグが付けられたTiddlerが[[tiddlywiki.filesファイル|tiddlywiki.files Files]]を使用してインポートされています。"isEditableFile"フラグがtrueに設定されているファイルにより、サーバーは$:/config/OriginalTiddlerPaths Tiddlerに元のファイルパスを記憶します。
Tiddlerが $:/config/FileSystemPaths フィルターのマッチを生成するたびに、Tiddlerのタイトル内の`/`や`\`がパス区切り文字にマップされます。上記のフィルターを使用すると、非システム、非ドラフトのTillder(タグなし)`some/thing/entirely/new`が`./wiki/some/thing/entirely/new.tid`に保存されます(つまり、`entirely/`というディレクトリ内の`new.tid`ファイル)。したがって、プラットフォームに応じて、 $:/config/FileSystemPaths 自体は`./_system/config/FileSystemPaths.tid`や`.\_system\config\FileSystemPaths.tid`に保存されます。
! ファイルシステム拡張子
通常、ディスク上のTiddlerのファイルシステム拡張子は、改行を含むフィールド値や空白で始まるか終わる(テキストフィールド以外の)フィールド値の存在によって決定されます。この場合、単一ファイル".json" Tiddlerファイル形式が使用されます。
Tiddlerにこのようなフィールド値がない場合、`type`フィールドが参照され、一致するファイルタイプが検索されます。タイプ値のないTiddlerの場合は`.tid`が使用されます。ブートエンジンは、[[$:/boot/boot.js]] Tiddlerで、Tiddlerタイプとファイルタイプの関係のセットを定義します。これらの関係を定義するコードのセクションを見つけるには、`// Add file extension information`を検索してください。
個々のTiddlerのファイル拡張子は、1つ以上の[[フィルタ式|Filter Syntax]](各行に1つずつ)を含むTiddler[[$:/config/FileSystemExtensions]]を作成することでカスタマイズできます。Tiddlerがディスクに保存されるたびに、これらのフィルタに対してテストされ、出力を生成する最初のフィルタの最初の出力が、Tiddlerファイルに使用されるファイル拡張子として使用されます。拡張子は常に先頭にドットを付ける必要があります(例を参照)。一致するフィルタがない場合は、デフォルトの拡張子が使用されます。拡張子が変更された場合は、新しいファイルが作成され、古いファイルは削除されます。
<<.note """".tid"の結果は、Tiddlerを単一ファイルのテキストTiddlerとしてディスクに書き込むことを強制します。".json"の結果は、Tiddlerをjson形式(配列内の単一のTiddler フィールドオブジェクト)の単一ファイルTiddlerとしてディスクに書き込むことを強制します。"application/json"タイプのTiddlerとしては書き込まれません。認識されるその他のすべてのファイルタイプは、定義された拡張子を使用して保存され、"text"フィールド以外のすべてのフィールドを説明する同じ名前の *.meta ファイルが付随します。""">>
!! 例
```
[tag[.txt]then[.txt]]
[tag[.json]then[.json]]
[tag[.tid]then[.tid]]
```
これにより、タグ".txt"を持つすべてのTiddlerが、ファイルシステムのパスフィルターによって決定されたファイルパスに保存されますが、テキストフィールドは *.txt ファイルとして保存され、その他のすべてのフィールドは *.txt.meta ファイルとして保存されます。
次に、".json"タグを持つすべてのTiddlerが *.json ファイルとして保存されます。最後に、タグ".tid"を持つすべてのTiddlerが単一のファイルとして保存されます。Tiddlerがどのフィルターにも一致しない場合は、Tiddlerの`type`フィールドによって決定されるデフォルトの拡張子が使用されます。

View File

@@ -0,0 +1,27 @@
created: 20140617211749290
modified: 20250120104354585
original-modified: 20220613114121229
tags: [[TiddlyWiki on Node.js]]
title: Environment Variables on Node.js
ja-title: Node.jsの環境変数
type: text/vnd.tiddlywiki
[[Node.js上のTiddlyWiki|TiddlyWiki on Node.js]]は、プラグインとエディションを検索するためのパスの区切りリストを指定するために、次のOS環境変数をサポートしています:
* `TIDDLYWIKI_PLUGIN_PATH` - 通常のプラグインの検索パス
* `TIDDLYWIKI_THEME_PATH` - テーマの検索パス
* `TIDDLYWIKI_LANGUAGE_PATH` - 言語の検索パス
* `TIDDLYWIKI_EDITION_PATH` - エディションの検索パス (InitCommandによって使用される)
<$macrocall $name=".note" _="""''1.'' 区切り文字はオペレーティングシステムによって異なる場合があります。Windowsではセミコロン`;`が使用されますが、Linux ではコロン`:`が使用されます。<br><br>''2.'' Linuxシステムでは、変数を定義するだけでなく//''export''//する必要もあります。
"""/>
追加のパスはそれぞれ、~TiddlyWiki5 GitHubリポジトリの同等のディレクトリのように、構造化されたフォルダを指す必要があります: プラグイン、テーマ、言語のディレクトリには`publisher/pluginname/<files>`が含まれ、エディションのディレクトリには`editionname/<files>`が含まれます
例:
```
export TIDDLYWIKI_PLUGIN_PATH=~/MyPluginStore
tiddlywiki mywiki --build index
```

View File

@@ -0,0 +1,16 @@
created: 20150926162849519
modified: 20241228110350676
original-modified: 20191022095509822
tags: [[TiddlyWiki on Node.js]]
title: Installing TiddlyWiki Prerelease on Node.js
ja-title: Node.jsにTiddlyWikiプレリリースをインストールする
type: text/vnd.tiddlywiki
# https://github.com/TiddlyWiki/TiddlyWiki5 からTiddlyWiki5 GitHubリポジトリのローカルコピーをクローンします
# コマンドラインターミナルを開き、現在の作業ディレクトリをTiddlyWiki5リポジトリのルートに変更します
# `npm link` (Windows) または `sudo npm link` (Mac/Linux) と入力して、[[npm]]にこのリポジトリのコピーをグローバルにインストールされたものとして使用するように指示します
# ルート内で、次のようにして~TiddlyWikiを起動できます: <br/>``tiddlywiki editions/tw5.com-server --listen``
この手順を実行すると、通常の方法`npm install -g tiddlywiki`でインストールした場合と同じように、[[npm]]経由でTiddlyWiki5を操作できるようになります。
最新のコードを確実に取得するために、クローンを定期的に更新してください。

View File

@@ -0,0 +1,23 @@
created: 20191022095653896
modified: 20250122105447127
original-modified: 20220617130125173
tags: [[TiddlyWiki on Node.js]] PluginsCS
title: Installing custom plugins on Node.js
ja-title: Node.jsにカスタムプラグインをインストールする
type: text/vnd.tiddlywiki
\rules except wikilink
! 紹介
Node.jsクライアントサーバー構成でTiddlyWikiを使用する場合、公式プラグインとカスタムプラグインをインストールするにはいくつかの方法があります。
注記
<$macrocall $name=".note" _="""ライブラリから単一ファイルWikiにプラグインをインストールする手順については、[[プラグイン|Plugins]]で詳細を確認してください。
"""/>
!! プラグインのロード順序
{{Plugin Ordering}}

View File

@@ -0,0 +1,41 @@
created: 20220611123344385
modified: 20250123113223702
original-modified: 20220617132351460
tags: [[TiddlyWiki on Node.js]] PluginsCS
title: Installing official plugins on Node.js
ja-title: Node.jsに公式プラグインをインストールする
type: text/vnd.tiddlywiki
クライアント-サーバーNode.js構成でTiddlyWikiを使用する場合は、次の手順に従ってください:
# <<controlPanel-plugin-link>>の''プラグイン''タブを使用してインストールするプラグインを特定します。(ただし、ここからプラグインをインストール''しないで''ください)
#* プラグインは、その種類(言語、テーマ、プラグイン)と発行元、タイトルによって識別されます。たとえば、`$:/plugins/tiddlywiki/internals`プラグインは''tiddlywiki/internals''として参照されます
# サーバーが実行中の場合は終了します
# `tiddlywiki.info`ファイル(JSON形式)を編集し、`plugins`、`themes`、`languages`セクションを見つけます(下記参照)
# 追加したいプラグインに対応するエントリを追加します
#* 項目を区切る''カンマ''を残すように注意してください
#* リストの最後の項目をコンマで終わらせ''ないで''ください
# サーバーを再起動します
```
{
"plugins": [
"tiddlywiki/codemirror"
],
"themes": [
"tiddlywiki/vanilla",
"tiddlywiki/snowwhite"
],
"languages": [
"es-ES",
"fr-FR",
"en-EN"
]
}
```
<$macrocall $name=".note" _="プラグインの操作の概要については、[[プラグイン|Plugins]]を参照してください。<br>また、[[Node.jsにカスタムプラグインをインストールする|Installing custom plugins on Node.js]]も参照してください。"/>

View File

@@ -0,0 +1,52 @@
created: 20131219100637788
modified: 20250124112753177
original-modified: 20141015165343893
tags: [[TiddlyWiki on Node.js]]
title: Scripts for TiddlyWiki on Node.js
ja-title: Node.js上のTiddlyWiki用スクリプト
type: text/vnd.tiddlywiki
! スクリプトファイル
TiddlyWiki5リポジトリの`bin`フォルダーには、共通のタスクを自動化したり、独自のスクリプトの便利な開始点として使用したりできるスクリプトがいくつか含まれています。https://tiddlywiki.com/ の構築とリリースに使用されるスクリプトの詳細については、[[Scripts for building tiddlywiki.com]]を参照してください。
すべてのスクリプトは、リポジトリのルートフォルダーから実行されることを想定しています。
!! `serve`: tw5.comを提供する
```
./bin/serve.sh -h
./bin/serve.sh [edition dir] [username] [password] [host] [port]
```
または:
```
./bin/serve.cmd -h
./bin/serve.cmd [edition dir] [username] [password] [host] [port]
```
このスクリプトは、TiddlyWiki5をHTTPサーバーとして実行し、`tw5.com-server`エディションのコンテンツをデフォルトにします。デフォルトでは、Node.jsは8080ポート でサービスを提供します。オプションの`username`パラメータが指定されている場合は、編集の署名に使用されます。`password`が指定されている場合は、HTTP基本認証が使用されます。`-h`パラメータを指定してスクリプトを実行すると、オンラインヘルプが表示されます。
この構成を試すには、スクリプトを実行してからブラウザで`http://127.0.0.1:8080`にアクセスしてください。
ブラウザで行われた変更は、HTTP経由でサーバーに伝えられます(これらのリクエストを確認するには、ブラウザ開発者コンソールを使用します)。その後、サーバーは変更をファイルシステムに同期します(各変更をスクリーンに記録します)。
!! `test`: テストをビルドして実行する
This script runs the `test` edition of TiddlyWiki on the server to perform the server-side tests and to build `test.html` for running the tests in the browser.
このスクリプトは、サーバー側のテストを実行し、ブラウザでテストを実行するために、`test.html`をビルドし、サーバー上でTiddlyWikiの`test`のエディションを実行します。
!! `lazy`: tw5.comを遅延読み込み画像で提供する
```
./bin/lazy.sh <username> [<password>]
```
または:
```
./bin/lazy.cmd <username> [<password>]
```
このスクリプトは、画像に[[遅延読み込み|LazyLoading]]を適用して`tw5.com-server`エディションコンテンツを提供します。

View File

@@ -0,0 +1,24 @@
created: 20131129094353704
modified: 20241227105025118
original-modified: 20220617114433107
tags: Platforms
title: TiddlyWiki on Node.js
ja-title: Node.js上のTiddlyWiki
type: text/vnd.tiddlywiki
\rules except wikilink
[[Node.js]]でTiddlyWikiを実行すると、単一ファイルバージョンに比べていくつかの重要な利点が得られます:
* 個々のTiddlerは別々のファイルに保存され、必要に応じて整理できます。
* 共有コンテンツと独自コンテンツのさまざまな組み合わせをブレンドした複数のWikiを構築する機能
* スマートフォンやタブレットを含むあらゆる最新ブラウザでコンテンツを編集できます
<<.warning """Node.js上のTiddlyWikiは現在、実行中にファイルシステム経由でTiddlerファイルを直接変更することをサポートしていないことに注意してください。変更を有効にするには、サーバーを再起動する必要があります。実行中の Wikiを編集するには、HTTPやJavaScript APIを使用することをお勧めします。""">>
詳細については、以下を参照してください:
<<list-links "[tag[TiddlyWiki on Node.js]]">>

View File

@@ -0,0 +1,33 @@
created: 20220611125113040
modified: 20250204103637098
original-modified: 20220617133704286
tags: [[TiddlyWiki on Node.js]] PluginsCS
title: Uninstalling a plugin with Node.js
ja-title: Node.jsでプラグインをアンインストールする
type: text/vnd.tiddlywiki
クライアント-サーバー Node.js構成でTiddlyWikiを使用する場合は、次の手順に従ってください:
# サーバーが実行中の場合は終了します
# `tiddlywiki.info`ファイル(JSON形式)を編集し、`plugins`と`themes`セクションを見つけます(下記参照)
# 削除したいプラグインに対応するエントリを削除します
#* 項目を区切る''カンマ''を残すように注意してください
#* リストの最後の項目をコンマで終わらせ''ない''でください
# サーバーを再起動します
```
{
"plugins": [
"tiddlywiki/codemirror"
],
"themes": [
"tiddlywiki/vanilla",
"tiddlywiki/snowwhite"
]
}
```
<$macrocall $name=".note" _="プラグインの操作方法の概要については、[[プラグイン|Plugins]]で確認できます"/>

View File

@@ -0,0 +1,19 @@
created: 20131219100544073
modified: 20241228112745930
original-modified: 20140912141800426
tags: [[TiddlyWiki on Node.js]]
title: Upgrading TiddlyWiki on Node.js
ja-title: Node.js上のTiddlyWikiのアップグレード
type: text/vnd.tiddlywiki
通常の方法で[[Node.js上のTiddlyWiki|TiddlyWiki on Node.js]]をインストールした場合、新しいバージョンがリリースされたときに、次のコマンドでアップグレードできます:
```
npm update -g tiddlywiki
```
MacやLinuxでは、次のように''sudo''を追加する必要があります:
```
sudo npm update -g tiddlywiki
```

View File

@@ -0,0 +1,43 @@
created: 20131219100520659
modified: 20250206101730728
original-modified: 20241025051303991
tags: [[TiddlyWiki on Node.js]]
title: Using TiddlyWiki on Node.js
ja-title: Node.jsでTiddlyWikiを使用する
type: text/vnd.tiddlywiki
~TiddlyWiki5には、[[TiddlyWikiフォルダ|TiddlyWikiFolders]]、[[Tiddlerファイル|TiddlerFiles]]に基づいて広範な操作を実行するためにコマンドラインで使用するコマンドセットが含まれています。
たとえば、次のコマンドは、~TiddlyWiki HTMLファイルからTiddlerを読み込み、そのうちの1つを静的HTMLに保存します:
```
tiddlywiki --verbose --load mywiki.html --render ReadMe ./readme.html
```
コマンドラインから`tiddlywiki`を実行すると、~TiddlyWikiカーネルが起動し、コアプラグインがロードされ、空のWikiストアが確立されます。次に、コマンドライン引数を左から右に順番に処理します。引数はスペースで区切られます。
<<.from-version "5.1.20">> まず、プレフィックス`+`で始まるプラグイン名や、`++`で始まるプラグインフォルダーへのパスによって識別される0個以上のプラグイン参照が存在する可能性があります。これらのプラグインは、[[TiddlyWikiフォルダ|TiddlyWikiFolders]]で指定されたプラグインに加えてロードされます。
次の引数は、ロードする[[TiddlyWikiフォルダ|TiddlyWikiFolders]]へのオプションのパスです。存在しない場合は、現在のディレクトリが使用されます。
コマンドとそれぞれの引数は以下のように示されます。各コマンドはプレフィックス`--`で識別されます。
```
tiddlywiki [+<pluginname> | ++<pluginpath>] [<wikipath>] [--<command> [<arg>[,<arg>]]]
```
例えば:
```
tiddlywiki --version
tiddlywiki +plugins/tiddlywiki/filesystem +plugins/tiddlywiki/tiddlyweb mywiki --listen
tiddlywiki ++./mygreatplugin mywiki --listen
```
<<.from-version "5.1.18">> 多数のパラメータをサポートするListenCommandなどのコマンドでは、[[名前付きコマンドパラメータ|NamedCommandParameters]]を使用して扱いやすくすることができます。例:
```
tiddlywiki wikipath --listen username=jeremy port=8090
```
使用可能なコマンドの完全なリストについては、[[コマンド|Commands]]を参照してください。

View File

@@ -0,0 +1,25 @@
created: 20131219100444289
modified: 20250206103847601
original-modified: 20140920134404247
tags: [[TiddlyWiki on Node.js]]
title: Working with the TiddlyWiki5 repository
ja-title: TiddlyWiki5リポジトリの操作
type: text/vnd.tiddlywiki
! 紹介
TiddlyWikiの開発に[[貢献|Contributing]]したい場合は、[[通常の方法でTiddlyWikiをインストールする|Installing TiddlyWiki on Node.js]]のではなく、GitHubリポジトリを直接動かすことができます。
Mario Pietschが[[短い紹介動画|Working with the TiddlyWiki5 repository video]]を作成しました。
! セットアップ
# GitHubのアカウントをお持ちでない場合は、アカウントを作成してください
# https://github.com/TiddlyWiki/TiddlyWiki5 からTiddlyWiki5 GitHubリポジトリをフォークします
# フォークのローカルコピーをクローンします
# コマンドラインターミナルを開き、現在の作業ディレクトリをリポジトリのルートに変更します
# `npm link` (Windows)か`sudo npm link` (Mac/Linux)と入力して、[[npm]]にこのリポジトリのコピーをグローバルにインストールされたものとして使用するように指示します
この手順を実行すると、`npm install -g tiddlywiki`による通常の方法でインストールした場合と同じように、[[npm]]経由でTiddlyWiki5を操作できるようになります。
[[Node.js上のTiddlyWiki用スクリプト|Scripts for TiddlyWiki on Node.js]]も参照してください。

View File

@@ -0,0 +1,172 @@
created: 20161015114118243
modified: 20250201104758596
original-modified: 20211114101256212
tags: TiddlyWikiFolders [[TiddlyWiki on Node.js]]
title: tiddlywiki.files Files
ja-title: tiddlywiki.filesファイル
type: text/vnd.tiddlywiki
! 紹介
[[TiddlyWikiフォルダ|TiddlyWikiFolders]]内のサブフォルダーにあるJSONファイル`tiddlywiki.files`は、フォルダーを再帰的にスキャンしてTiddlerファイルを探す通常のロジックをオーバーライドします。代わりに、`tiddlywiki.files`ファイルは特定のファイルとフォルダーからTiddlerをロードするための指示を指定します。
ファイルの形式は、2つのオプションプロパティを持つオブジェクトです:
* ''tiddlers'' - ファイルから読み取ったフィールドを上書きや変更する機能を持つ外部ファイルを記述するオブジェクトの配列
* ''directories'' - 外部ディレクトリを記述するオブジェクトの配列、それらのディレクトリ内のどのファイルを処理すべきかを決定するフィルターと、ファイルから読み取ったフィールドのいずれかを上書きや変更する機能
`tiddlywiki.files`の処理に大幅な機能強化が[[リリース 5.1.14|Release 5.1.14]]で導入されたことに注意してください。
!! フィールドのオーバーライド
`tiddlywiki.files`ファイルの''tiddlers''セクションと''directories''セクションの両方に、`fields`オブジェクトを使用してフィールドの値を上書きやカスタマイズする機能が含まれています。
各フィールドは、フィールドに直接割り当てられる''文字列''や''配列''値として指定することも、<<.from-version "5.1.14">>フィールドの値を生成する方法を説明する''オブジェクト''として指定することもできます。オブジェクトには次のプロパティが含まれます:
* ''source'' - (オプション) フィールドのソース値を指定する文字列。指定しない場合は、既存の値が使用されます
** //filename// Tiddlerを含むファイルのファイル名
** //filename-uri-decoded// [[URIデコード|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent]]を適用した、Tiddlerを含むファイルのファイル名
** //basename// 拡張子なしのTiddlerを含むファイルのファイル名
** //basename-uri-decoded// [[URIデコード|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent]]を適用した、拡張子なしのTiddlerを含むファイルのファイル名
** //extname// Tiddlerを含むファイル名の拡張子
** //created// Tiddlerを含むファイルの作成日時
** //modified// Tiddlerを含むファイルの更新日時
** <<.from-version "5.3.0">> //filepath// ディレクトリの''path''プロパティを基準とした、Tiddlerを含むファイルのパス(''directories''宣言でのみ使用可能)
** <<.from-version "5.3.0">> //subdirectories// ディレクトリの''path''プロパティを基準とした、ファイルの相対パス内のサブディレクトリの配列(''directories''宣言でのみ使用可能)
* ''prefix'' - (オプション) フィールドの値の先頭に追加する文字列
* ''suffix'' - (オプション) フィールドの値の末尾に追加する文字列
! Tiddlersセクション
`tiddlers`配列内のファイルの仕様は、次のプロパティをサポートします:
* ''file'': (必須) Tiddlerデータを含むファイルへの絶対パスまたは相対パス (相対パスは`tiddlywiki.files`ファイルのパスを基準とします)
* ''isTiddlerFile'': (オプション) `true`の場合、ファイルは[[tiddlerファイル|TiddlerFiles]]として扱われ、Tiddlerを抽出するためにデシリアライズされます。それ以外の場合は、ファイルの生のコンテンツが解析されずに`text`フィールドに割り当てられます
* ''fields'': (オプション) Tiddlerファイルで提供されるフィールドを上書きやカスタマイズする値を含むオブジェクト (上記を参照)
* ''prefix''と''suffix'': (オプション) Tiddlerの`text`フィールドにプレフィックスとサフィックスとして付加される文字列
*> ''prefix''を指定することは、''fields''オブジェクトの`text`のフィールドを`{"prefix":"<prefixvalue>"}`に設定することと同じであることに注意してください。
! Directoriesセクション
`directories`配列内のディレクトリの仕様は次の形式を取ることができます:
* Tiddlerファイルを含むディレクトリへの絶対パスか相対パスを指定する、''string''リテラル(相対パスは`tiddlywiki.files`ファイルのパスを基準として解釈されます)。Tiddlerファイルはディレクトリを再帰的に検索されます
* <<.from-version "5.1.14">> 次のプロパティを持つ''object'':
** ''path'' - (必須) Tiddlerファイルを含むディレクトリへの絶対パスか相対パス(相対パスは`tiddlywiki.files`ファイルのパスを基準として解釈されます)。デフォルトではディレクトリは再帰的に検索されないことに注意してください。//searchSubdirectories//フラグが`true`に設定されていない限り、サブディレクトリは無視されます(以下を参照)。
** ''filesRegExp'' - (オプション) ディレクトリ内で処理するファイルのファイル名に一致する[[正規表現|https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions]]
** ''isTiddlerFile'' - (必須) `true`の場合、ファイルは[[Tiddlerファイル|TiddlerFiles]]として扱われ、Tiddlerを抽出するためにデシリアライズされます。それ以外の場合、ファイルの生のコンテンツが解析されずに`text`フィールドに割り当てられます
** ''isEditableFile'' - <<.from-version "5.1.23">> (オプション) `true`の場合、Tiddlerへの変更は元のファイルに保存されます。Tiddlerは、$:/config/FileSystemPathフィルターから結果が生成されない限り、元のファイルパスに保存されます。フィルターから結果が返された場合、生成された最終的なファイルパスが上書きされます。
** ''searchSubdirectories'' - <<.from-version "5.1.23">> (オプション) `true`の場合、//path//のすべてのサブディレクトリで(オプションの)//filesRegExp//に一致するファイルが再帰的に検索されます。//filesRegExp//が指定されていない場合は、//path//のすべてのサブディレクトリ内のすべてのファイルがロードされます。//source//属性の//filename//(上記を参照)によって生成されたTiddlerタイトルにはファイル名のみが含まれ、パスのサブディレクトリは含まれません。この結果、同じTiddlerタイトルでロードされた複数のファイルが存在する場合、そのTiddlerタイトルでロードされた最後のファイルのみがメモリに格納されます。これを防ぐには、//filename//の代わりに//filepath//属性を使用できます。または、複数のディレクトリオブジェクトを含め、//source//属性とともに//prefix//または//suffix//を使用してタイトルフィールドをカスタマイズすることもできます。
** ''fields'' - (必須) Tiddlerファイルで提供されるフィールドを上書きやカスタマイズする値を含むオブジェクト(上記を参照)
同じ名前にサフィックス`.meta`を加えたファイルを作成することで、特定のファイルのフィールドを上書きすることもできます。 -- TiddlerFilesを参照してください。
! 例
これらの`tiddlywiki.files`の例は、[[Wikiフォルダ|TiddlyWikiFolders]]の独自のサブディレクトリに配置する必要があります。
メインの[[TiddlyWiki 5 GitHub リポジトリ|https://github.com/TiddlyWiki/TiddlyWiki5]]にも`tiddlywiki.files`ファイルの例がいくつかあります。
!! PDFのフォルダをインポートする
この例では、相対パスで指定されたフォルダーから拡張子`.pdf`を持つすべてのファイルを取得します。このパスは"../../../"で始まり、この構成ファイルが格納されているフォルダーの3ディレクトリ階層上を示します。各Tiddlerは、次のフィールドを使用してLazyLoading用にセットアップされています:
* ''title'' - PDFファイルのURIデコードされたベースファイル名を設定。[[URIデコード|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent]]により、"/"などの文字をURIエンコードして"%2F"としてタイトルに含めることができます
* ''created'' - PDFファイルの作成日時を設定
* ''modified'' - PDFファイルの変更日時を設定
* ''type'' - `application/pdf`を設定
* ''tags'' - `$:/tags/AttachedFile`を設定
* ''text'' - 空の文字列を設定
* ''_canonical_uri'' - ファイル名と文字列"pdfs/"を連結した値を設定
```
{
"directories": [
{
"path": "../../../input/pdfs",
"filesRegExp": "^.*\\.pdf$",
"isTiddlerFile": false,
"fields": {
"title": {"source": "basename-uri-decoded"},
"created": {"source": "created"},
"modified": {"source": "modified"},
"type": "application/pdf",
"tags": ["$:/tags/AttachedFile"],
"text": "",
"_canonical_uri": {"source": "filename", "prefix": "pdfs/"}
}
}
]
}
```
!! テキストファイルのフォルダをインポートする
この例では、相対パスで指定されたフォルダから拡張子`.txt`を持つすべてのファイルを取得します。このフォルダはWikiのベースディレクトリ内にあり、現在の構成ファイルはWikiの"tiddlers/"ディレクトリ内のディレクトリにあります。したがって、この場合、パスは"../../"で始まり、2つのディレクトリ階層上に移動し、次に "externalnotes/"ディレクトリまで下ります。各Tiddlerは次のフィールドで設定されます:
* ''title'' - テキストファイルのURIデコードされたベースファイル名を設定します。[[URIデコード|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent]]により、"/"などの文字をURIエンコードして"%2F"としてタイトルに含めることができます
* ''created'' - テキストファイルの作成日時を設定
* ''modified'' - テキストファイルの変更日時を設定
* ''type'' - `text/plain`を設定
* ''tags'' - `[[note]] [[externalnote]] [[.txt]]`を設定(配列表記を使用)
* ''text'' - 設定されないため、ファイルの内容がテキストフィールドとして読み込まれます
```
{
"directories": [
{
"path": "../../externalnotes",
"filesRegExp": ".+\\.txt",
"isTiddlerFile": false,
"isEditableFile": true,
"fields": {
"title": {"source": "basename-uri-decoded"},
"created": {"source": "created"},
"modified": {"source": "modified"},
"type": "text/plain",
"tags": ["note", "externalnote", ".txt"]
}
}
]
}
```
これにより、`../../externalnotes/`ディレクトリ内のすべてのテキストファイルが個別のTiddlerとしてWikiに読み込まれます。これらは、さまざまなマークアップ言語のスニペットコレクションである可能性があります。次に、これらの各Tiddlerの`type`フィールドを、言語に合わせて変更できます。たとえば、Wikitextの場合は"text/vnd.tiddlywiki"、マークダウンファイルの場合は"text/markdown"です。次に、次の行で$:/config/FileSystemPathsと$:/config/FileSystemExtentions Tiddlerを使用すると、これらのTiddlerへの変更が、開始元のディレクトリに保存され、"*.txt"ファイルとして、"*.txt.meta"ファイルとともに保存されます。これらのメタファイルは必要に応じて生成され、サーバーの再起動時に、`tiddlywiki.files`構成ファイルから生成されたフィールド(Tiddlerの`type`フィールドなど)が上書きされます。
[[Tiddlerファイル名のカスタマイズ|Customising Tiddler File Naming]]の例から、$:/config/FileSystemPaths Tiddler内の最後のフィルター`[!tag[externalnote]addprefix[wiki/]]`は、`externalnotes`でタグ付けされたすべてのTiddler(以前のフィルターに一致しなかったもの)を除外することがわかります。これらのTiddlerのファイルパスは、ブート起動時に生成された$:/config/OriginalTiddlerPathsから取得されます。
次に、$:/config/FileSystemExtensions Tiddler内のフィルター`[tag[.txt]then[.txt]]`により、これらすべてのTiddlerが*.txtおよび付随する*.txt.metaファイルとしてディスクに保存されます(通常のTiddlerタイプとファイルタイプのマッピングを上書きします)。この場合、Tiddlywiki Wikitextやマークダウンテキストのスニペットを"テキスト"(*.txtファイル)に保存できるようになります。
!! 画像のインポートと自動タグ付け
この例では、`files`ディレクトリとそのすべてのサブディレクトリ内のすべての画像ファイルを外部画像Tiddlerとしてインポートし、ファイルパスに基づいてタグ付けします。各Tiddlerには、次のフィールドが設定されます:
* ''title'' - テキストファイルのURIデコードされたベースファイル名を設定
* ''created'' - テキストファイルの作成日時を設定
* ''modified'' - テキストファイルの更新日時を設定
* ''type'' - `image/jpeg`に設定します。現在、ファイルから画像Tiddlerの正しいContentTypeを推測する方法はありませんが、`image/jpeg`Tiddlerはpngやgif画像でも正しくレンダリングされるはずです。代わりに、jpg、png、gifファイルの個別の定義を、`image/jpeg`、`image/png`、`image/gif`タイプをそれぞれ使用して作成することもできます。
* ''tags'' - 親ディレクトリ(この場合は`files`)を基準とした画像の相対パスに基づいて生成されます。たとえば、`files/photos`内の画像には`photos`のタグが付けられ、 `files/photos/family`内の画像には`photos`と`family`両方のタグが付けられ、ルート`files`ディレクトリ内の画像にはタグが付けられません。
* ''text'' - 空の文字列に設定
* ''_canonical_uri'' - Wikiルートを基準とした画像の完全な相対ファイルパスを設定
```
{
"directories": [
{
"path": "../../files/",
"filesRegExp": "^.*\\.(?:jpg|jpeg|png|gif)$",
"isTiddlerFile": false,
"searchSubdirectories": true,
"fields": {
"title": {"source": "basename-uri-decoded"},
"created": {"source": "created"},
"modified": {"source": "modified"},
"type": "image/jpeg",
"tags": { "source": "subdirectories" },
"text": "",
"_canonical_uri": { "source": "filepath", "prefix": "files/" }
}
}
]
}
```

View File

@@ -0,0 +1,60 @@
created: 20161015114042793
modified: 20250201105445142
original-modified: 20241030132156792
tags: TiddlyWikiFolders [[TiddlyWiki on Node.js]]
title: tiddlywiki.info Files
ja-title: tiddlywiki.infoファイル
type: text/vnd.tiddlywiki
[[TiddlyWikiフォルダ|TiddlyWikiFolders]]はWikiフォルダーのルートにある1つの`tiddlywiki.info`ファイルで構成されます。このファイルには、次のプロパティを含むJSONオブジェクトが含まれている必要があります:
* ''plugins'' - Wikiに含めるプラグインの配列
* ''themes'' - Wikiに含めるテーマの配列
* ''languages'' - Wikiに含める言語の配列
* ''includeWikis'' - Wikiに含める外部Wikiフォルダへの参照の配列
* ''build'' - 名前付きビルドターゲットのハッシュマップ。それぞれはコマンドトークンの配列で定義されます(BuildCommandを参照)
* ''config'' - 設定オプションのオプションのハッシュマップ(下記参照)
!!! ''includeWikis''
''includeWikis''配列のエントリは、Wikiへの相対パスを指定する文字列か、次のフィールドを持つオブジェクトのいずれかになります:
* ''path'' - Wikiフォルダへの相対パス
* ''read-only'' - //true//に設定すると、含まれているWiki内のTiddlerが変更されるのを防ぎます。変更は、以下で説明する''default-tiddler-location''で指定されたディレクトリに書き込まれます
!!! ''build''
現在の`tiddlywiki.info`ファイルでその名前のターゲットが定義されていない場合、含まれているWikiのビルドターゲットはマージされることに注意してください。
!!! ''config''
構成オプションには以下が含まれます:
* ''default-tiddler-location'' - ファイルシステムアダプタが新しいTiddlerを保存するためのデフォルトの場所への文字列パス(Wikiフォルダを基準に解決)
* ''retain-original-tiddler-path'' - trueの場合、サーバーはWiki内の各Tiddlerの元のファイルパスを含むティドラー[[$:/config/OriginalTiddlerPaths]]を生成します
!!! 例
例:
```
{
"plugins": [
"tiddlywiki/tiddlyweb",
"tiddlywiki/filesystem"
],
"includeWikis": [
{"path": "../tw5.com", "read-only": true}
],
"build": {
"index": [
"--render","$:/core/save/all","index.html","text/plain"],
"favicon": [
"--save", "$:/favicon.ico", "favicon.ico",
"--save", "$:/green_favicon.ico", "static/favicon.ico"]
},
"config": {
"retain-original-tiddler-path": true
}
}
```

View File

@@ -0,0 +1,12 @@
created: 20150412185300152
modified: 20241227104147434
original-modified: 20150412185427211
tags: TableOfContents
title: Platforms
ja-title: プラットフォーム
type: text/vnd.tiddlywiki
TiddlyWikiはいくつかのプラットフォームで使用できます:
<<list-links "[tag[Platforms]]">>

View File

@@ -0,0 +1,49 @@
created: 20220613115453346
modified: 20250207104327815
original-modified: 20220628160136158
tags: PluginMechanism
title: Plugin Ordering
ja-title: プラグインの順序
type: text/vnd.tiddlywiki
Node.jsクライアント-サーバー構成を使用すると、プラグインは次の順序でアクティブになります:
# OS環境変数を使用して見つかったプラグイン
#* 参照: [[PluginFolders]]
#* および: [[Node.jsの環境変数|Environment Variables on Node.js]]
# Wiki`/plugins`パスに保存されたプラグイン
#* 参照: [[PluginFolders]]
# コマンドラインで指定されたプラグイン
#* 参照: [[Node.jsでTiddlyWikiを使用する|Using TiddlyWiki on Node.js]] ... <<.from-version "5.1.20">>に関する注記
# ドラッグアンドドロップでWikiコンテンツとしてインポートされたプラグイン
#* 参照: [[プラグインライブラリからプラグインをインストールする|Installing a plugin from the plugin library]]や[[プラグインを手動でインストールする|Manually installing a plugin]]
''重要:''
* ''リストの下位の要素が優先されます''
*ブラウザにドラッグアンドドロップして通常のTiddlerとしてプラグインを追加すると、プラグインはブラウザ内でのみアクティブになります
** Node.js下では利用できません
オプション 1:
* Node.js構成を使用する場合、オプション1が最も一般的な方法です
* すべてのプラグインを一度に更新できるため、メンテナンスの手間が軽減されます
オプション 2:
* 構成を固定して作業したい場合はオプション2が推奨されます
* プラグインの更新は対応するWikiにのみ影響します
オプション 3:
* このオプションを使用すると、既存の`tiddlywiki.info`ファイルを上書きすることなくエディションを''追加して開始''できます
* tiddlywiki.infoファイルで指定されていない場合でも、任意のエディションをクライアント-サーバーエディションとして起動できます。
オプション 4:
* 単一ファイルのWikiで使用されるのと全く同じメカニズムです
* このメカニズムは、プラグインが`tiddlers/`ディレクトリに保存されるため、Node.js構成では''テストとデバッグ''の目的でのみ使用する必要があります

View File

@@ -0,0 +1,2 @@
title: $:/config/tiddlyweb/host
text: $protocol$//$host$/MyApp/

View File

@@ -0,0 +1,7 @@
title: Example config-tiddlyweb-host for IIS
ja-title: IISのconfig-tiddlyweb-hostの例
created: 20180328145039530
modified: 20250123113649343
original-modified: 20180328145234871
tags: [[Installing TiddlyWiki on Microsoft Internet Information Server]]
type: text/plain

View File

@@ -0,0 +1,8 @@
{
"name": "MyStuff",
"description": "A description of this wiki",
"dependencies": {
"sax": "1.2.4",
"tiddlywiki": "*"
}
}

View File

@@ -0,0 +1,7 @@
created: 20180328145039530
modified: 20250123114135455
original-modified: 20180328145234871
tags: [[Installing TiddlyWiki on Microsoft Internet Information Server]]
title: Example package.json for IIS
ja-title: IISのpackage.jsonの例
type: text/plain

View File

@@ -0,0 +1,11 @@
{
"description": "My wiki",
"plugins": [
"tiddlywiki/tiddlyweb",
"tiddlywiki/filesystem"
],
"themes": [
"tiddlywiki/vanilla",
"tiddlywiki/snowwhite"
]
}

View File

@@ -0,0 +1,7 @@
created: 20180328151124878
modified: 20250123114435480
original-modified: 20180328151214616
tags: [[Installing TiddlyWiki on Microsoft Internet Information Server]]
title: Example tiddlywiki.info for IIS
ja-title: IISのtiddlywiki.infoの例
type: text/plain

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add
name="httpplatformhandler"
path="*"
verb="*"
modules="httpPlatformHandler"
resourceType="Unspecified"
requireAccess="Script" />
</handlers>
<httpPlatform
stdoutLogEnabled="true"
stdoutLogFile=".\node.log"
startupTimeLimit="20"
processPath="C:\Program Files\nodejs\node.exe"
arguments=".\node_modules\tiddlywiki\tiddlywiki.js ./wiki --listen port=PORT path-prefix=/MyApp">
<environmentVariables>
<environmentVariable name="PORT" value="%HTTP_PLATFORM_PORT%" />
<environmentVariable name="NODE_ENV" value="Production" />
</environmentVariables>
</httpPlatform>
</system.webServer>
</configuration>

View File

@@ -0,0 +1,7 @@
created: 20180328145259455
modified: 20250123114732207
original-modified: 20180701185215523
tags: [[Installing TiddlyWiki on Microsoft Internet Information Server]]
title: Example web.config for IIS
ja-title: IISのweb.configの例
type: text/plain

View File

@@ -2,11 +2,4 @@ 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/ai-tools

View File

@@ -17,7 +17,9 @@
"tiddlywiki/jszip",
"tiddlywiki/confetti",
"tiddlywiki/dynannotate",
"tiddlywiki/tour"
"tiddlywiki/tour",
"tiddlywiki/markdown",
"tiddlywiki/ai-tools"
],
"themes": [
"tiddlywiki/vanilla",

View File

@@ -0,0 +1,34 @@
title: Transclude/CustomWidget/RawAndSlotted
description: Custom widget can mix ts-raw and custom slots
type: text/vnd.tiddlywiki-multiple
tags: [[$:/tags/wiki-test-spec]]
title: Output
\whitespace trim
\widget $my.widget()
\whitespace trim
<$slot $name="ts-header">
Default Header
</$slot>
-
<$slot $name="ts-raw"/>
\end
<$my.widget>
First Body
</$my.widget>
<$my.widget>
<$fill $name="ts-header">
Custom Header
</$fill>
<$fill $name="ts-never">
<$log RawAndSlotted="Transclude/CustomWidget/RawAndSlotted is actually failing. $fill slots are executing silently when they weren't invoked." />
</$fill>
Second Body
</$my.widget>
+
title: ExpectedResult
<p>Default Header-First Body</p><p>Custom Header-Second Body</p>

View File

@@ -78,6 +78,13 @@ Tests the checkbox widget thoroughly.
startsOutChecked: false,
expectedChange: { "TiddlerOne": { expand: "yes" } }
},
{
testName: "field mode default when missing -> true",
tiddlers: [],
widgetText: "<$checkbox tiddler='TiddlerOne' field='expand' default='yes' checked='yes' unchecked='no' />",
startsOutChecked: true,
expectedChange: { "TiddlerOne": { expand: "no" } }
},
{
testName: "field mode indeterminate -> true",
tiddlers: [{title: "TiddlerOne", text: "Jolly Old World", expand: "some other value"}],
@@ -98,19 +105,28 @@ Tests the checkbox widget thoroughly.
var indexModeTests = fieldModeTests.map(data => {
var newData = {...data};
var newName = data.testName.replace('field mode', 'index mode');
var tiddlerOneAlreadyExists = false;
var newTiddlers = data.tiddlers.map(tiddler => {
if(tiddler.title === "TiddlerOne") {
tiddlerOneAlreadyExists = true;
}
return {title: tiddler.title, type: "application/x-tiddler-dictionary", text: `one: a\nexpand: ${tiddler.expand}\ntwo: b`}
});
var newWidgetText = data.widgetText.replace("field='expand'", "index='expand'");
var newChange = {};
for (var key of Object.keys(data.expectedChange)) {
var oldChange = data.expectedChange[key];
if (oldChange.expand) {
newChange[key] = { text: `one: a\nexpand: ${oldChange.expand}\ntwo: b` }
var text;
if (!tiddlerOneAlreadyExists) {
// If it wasn't there, the created one will be JSON
text = `{\n "expand": "${oldChange.expand}"\n}`;
} else if (oldChange.expand) {
text = `one: a\nexpand: ${oldChange.expand}\ntwo: b`;
} else {
// In index tiddlers, the "expand" field gets completely removed, not turned into "expand: (undefined)"
newChange[key] = { text: `one: a\ntwo: b` }
text = `one: a\ntwo: b`;
}
newChange[key] = { text: text };
}
newData.testName = newName;
newData.tiddlers = newTiddlers;
@@ -514,7 +530,9 @@ Tests the checkbox widget thoroughly.
/*
* Checkbox widget tests using the test data above
*/
for (var data of checkboxTestData) {
// MAKE SURE TO USE $tw.utils.each HERE!!!
// If you use a forloop, the closure of the tests will all use the last value "data" was assigned to, and thus all run the same test.
$tw.utils.each(checkboxTestData, function(data) {
it('checkbox widget test: ' + data.testName, function() {
// Setup
@@ -553,7 +571,7 @@ Tests the checkbox widget thoroughly.
}
}
})
}
});
});

View File

@@ -12,7 +12,6 @@ Use this procedure if the language being submitted is not already present in the
# Create the new language folder `languages/xx-XX`
# Copy the language files into the language folder
# Create a `plugin.info` file for the translation
# Create an appropriate flag image in `icon.tid`
# Add the new language to tw5.com
# Submit a pull request

View File

@@ -0,0 +1,8 @@
created: 20250211093401937
modified: 20250211093527189
tags: Concepts
title: Tags
Tags are used to organise tiddlers into categories.
For more details see: [[Tagging]]

View File

@@ -0,0 +1,8 @@
created: 20250211094052630
modified: 20250211094419548
tags: Concepts
title: Title
The minimum requirement for a valid tiddler is a ''unique'' title.
Learn more at: [[Tiddlers]]

View File

@@ -22,8 +22,3 @@ There are several resources for developers to learn more about TiddlyWiki and to
*** An enhanced group search facility is available on [[mail-archive.com|https://www.mail-archive.com/tiddlywikidev@googlegroups.com/]]
* Chat at https://gitter.im/TiddlyWiki/public (development room coming soon)
! Twitter
* Follow [[@TiddlyWiki on Twitter|http://twitter.com/#!/TiddlyWiki]] for the latest news

View File

@@ -4,7 +4,7 @@ tags: Community
title: Articles
type: text/vnd.tiddlywiki
Here are some recent articles written about ~TiddlyWiki. Submit new articles via GitHub, Twitter or by posting in the [[TiddlyWiki Groups|Forums]].
Here are some recent articles written about ~TiddlyWiki. Submit new articles via GitHub or by posting in the [[TiddlyWiki Groups|Forums]].
<div class="tc-link-info">

View File

@@ -4,7 +4,7 @@ tags: HelloThere Community
title: Examples
type: text/vnd.tiddlywiki
This collection showcases inspiring and interesting examples of ~TiddlyWiki being used in the wild. Submit new entries to this collection via GitHub, Twitter or by posting in the [[TiddlyWiki Groups|Forums]].
This collection showcases inspiring and interesting examples of ~TiddlyWiki being used in the wild. Submit new entries to this collection via GitHub or by posting in the [[TiddlyWiki Groups|Forums]].
<div class="tc-link-info">

View File

@@ -10,8 +10,6 @@ If you find TiddlyWiki useful, there are lots of ways you can help assure its fu
OpenSource projects like ~TiddlyWiki thrive on the feedback and engagement of users. ~TiddlyWiki becomes more useful to everyone as more and more people use it. So, if you find ~TiddlyWiki useful, spread the word. The best possible way to assure its future is for it to become a hundred times more popular than before.
* [img[https://img.shields.io/twitter/url/http/tiddlywiki.com.svg?style=social]]
* Tweet about ~TiddlyWiki: [[I love TiddlyWiki because...|https://twitter.com/intent/tweet?text=I+love+TiddlyWiki+because...&source=tiddlywiki5]]
* [img[https://img.shields.io/github/stars/jermolene/tiddlywiki5.svg?style=social&label=Star]]
* [[Star the TiddlyWiki5 GitHub Repository|https://github.com/TiddlyWiki/TiddlyWiki5]]
* [[Display the TiddlyWiki Poster|https://tiddlywiki.com/poster]]

View File

@@ -4,7 +4,7 @@ tags: Community Videos
title: TiddlyWiki Hangouts
type: text/vnd.tiddlywiki
The TiddlyWiki community has held many Google Hangouts over the years. They are announced in the [[TiddlyWiki Google group|https://groups.google.com/d/forum/tiddlywiki]] and on the [[TiddlyWiki Twitter account|https://twitter.com/TiddlyWiki]].
The TiddlyWiki community has held many Google Hangouts over the years. They are announced in the [[TiddlyWiki Google group|https://groups.google.com/d/forum/tiddlywiki]].
Past Hangouts are archived in this ~YouTube playlist:

View File

@@ -1,7 +1,7 @@
color: #808
created: 20241009150445080
icon: $:/core/images/link
list: TalkTiddlyWiki [[TiddlyWiki on YouTube]] [[TiddlyWiki on Reddit]] [[TiddlyWiki on Discord]] [[TiddlyWiki on GitHub]] [[TiddlyWiki on Mastodon]] [[TiddlyWiki on Twitter]] [[TiddlyWiki on Gitter]] [[TiddlyWiki on Open Collective]]
list: TalkTiddlyWiki [[TiddlyWiki on YouTube]] [[TiddlyWiki on Reddit]] [[TiddlyWiki on Discord]] [[TiddlyWiki on GitHub]] [[TiddlyWiki on Mastodon]] [[TiddlyWiki on Gitter]] [[TiddlyWiki on Open Collective]]
modified: 20241115170824144
tags: Welcome
title: TiddlyWiki on the Web

View File

@@ -1,7 +0,0 @@
title: TiddlyWiki on Twitter
caption: Twitter
tags: [[TiddlyWiki on the Web]]
url: https://twitter.com/TiddlyWiki
icon: $:/core/images/twitter
background-color: #1DA1F2
text-color: #fff

View File

@@ -8,4 +8,4 @@ type: text/vnd.tiddlywiki
These are the concepts underlying TiddlyWiki. Understanding how these ideas fit together is the key to getting the most from TiddlyWiki.
<<list-links "[tag[Concepts]]" class:"multi-columns">>
<<list-links "[tag[Concepts]sort[title]]" class:"multi-columns">>

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