mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2026-02-12 21:19:50 +00:00
Compare commits
312 Commits
feat-ai-to
...
multi-wiki
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c7dc21aa81 | ||
|
|
19e341c760 | ||
|
|
739ba3288b | ||
|
|
b4583ef9c5 | ||
|
|
2a9f646ec4 | ||
|
|
6d448499c7 | ||
|
|
b8f2800dab | ||
|
|
d72a4c9826 | ||
|
|
ddfc8c469c | ||
|
|
faf5d6982e | ||
|
|
1f1b785524 | ||
|
|
1d65f0070c | ||
|
|
0198eb2a1a | ||
|
|
1c5648826e | ||
|
|
02a9fdcd06 | ||
|
|
d0a3c79383 | ||
|
|
e48ea2dbe6 | ||
|
|
060bea89ae | ||
|
|
67232aab15 | ||
|
|
ae5bd9d4cd | ||
|
|
a00e3e79d6 | ||
|
|
ab5a48747f | ||
|
|
239aacfa03 | ||
|
|
e3ce053745 | ||
|
|
2735ce23d8 | ||
|
|
cb6c471967 | ||
|
|
8defedd611 | ||
|
|
d7eb39c88e | ||
|
|
ac59af19dd | ||
|
|
0cd2190ddf | ||
|
|
266b32bfee | ||
|
|
a697a664fa | ||
|
|
9f48e75945 | ||
|
|
4dc2486d4b | ||
|
|
d9256707f4 | ||
|
|
e85cfdefa6 | ||
|
|
b198270cb5 | ||
|
|
3836a5d08c | ||
|
|
83f7b9023d | ||
|
|
9362121e8d | ||
|
|
07c3081e7f | ||
|
|
7c4d0d7f5e | ||
|
|
520188dc2b | ||
|
|
aa0d59e4ba | ||
|
|
c1a441b7a1 | ||
|
|
0f558a1442 | ||
|
|
31a7d648e5 | ||
|
|
a6c5b86343 | ||
|
|
ffbf24ae92 | ||
|
|
12e48af372 | ||
|
|
f61a131119 | ||
|
|
8d53a37d34 | ||
|
|
386af03f6d | ||
|
|
8ac2730eb1 | ||
|
|
e873518d6f | ||
|
|
316bd65296 | ||
|
|
3a5f67d4f5 | ||
|
|
ad901a9f50 | ||
|
|
c7531e53ab | ||
|
|
6a7612ddf8 | ||
|
|
5d6ddaee7e | ||
|
|
d0575d6e8e | ||
|
|
6dd6b7bef1 | ||
|
|
517dae8242 | ||
|
|
d0b5f413a4 | ||
|
|
6e7efeb126 | ||
|
|
0f4f60f978 | ||
|
|
a9c124cffd | ||
|
|
4050ba5f92 | ||
|
|
b698b3e9cf | ||
|
|
a930411cfd | ||
|
|
90848a1e96 | ||
|
|
c73311684b | ||
|
|
8a5a684218 | ||
|
|
3287dce40c | ||
|
|
eac8a2c3d8 | ||
|
|
535c440741 | ||
|
|
9eb28a0e5f | ||
|
|
edc32c5262 | ||
|
|
6492ed36bf | ||
|
|
2819b53c04 | ||
|
|
adb2ffcd4d | ||
|
|
97db75e741 | ||
|
|
066771e6e9 | ||
|
|
b4664bd7d1 | ||
|
|
882438db14 | ||
|
|
e9f314579d | ||
|
|
9e2962b24e | ||
|
|
5b53a14903 | ||
|
|
39b7a4fb71 | ||
|
|
f1d0e52ff7 | ||
|
|
d1edf6424d | ||
|
|
e9cbb51f68 | ||
|
|
0ff3875b8a | ||
|
|
38e1ea8f90 | ||
|
|
2b2fd4bdb7 | ||
|
|
b8f463d8ba | ||
|
|
3f30cb4991 | ||
|
|
049951e269 | ||
|
|
3c36e4bd55 | ||
|
|
d03ad0bca6 | ||
|
|
109d92ae68 | ||
|
|
e396334b20 | ||
|
|
d8fd9af63a | ||
|
|
9b6d677726 | ||
|
|
a37d50166f | ||
|
|
b4564e31bd | ||
|
|
33fb857d6b | ||
|
|
4c2c7266d7 | ||
|
|
3c7f06009b | ||
|
|
87f4a525f8 | ||
|
|
92a1c56d31 | ||
|
|
d8eb5cb459 | ||
|
|
268aaebaf0 | ||
|
|
ea318bab6e | ||
|
|
aafe775779 | ||
|
|
129bbe421c | ||
|
|
471ba99a5d | ||
|
|
516a17a6f0 | ||
|
|
2e4980bb97 | ||
|
|
db9978f8c2 | ||
|
|
cc4cb04900 | ||
|
|
9ba4556250 | ||
|
|
131a5abeb8 | ||
|
|
ce79a4add8 | ||
|
|
28a831489b | ||
|
|
51cdca6841 | ||
|
|
d51ad80f80 | ||
|
|
ad528d6b1f | ||
|
|
f2947e73b3 | ||
|
|
baee0bb301 | ||
|
|
8a2111f150 | ||
|
|
fcffff3964 | ||
|
|
cca1f21d02 | ||
|
|
37f6930bf2 | ||
|
|
4b1affee50 | ||
|
|
464d17b522 | ||
|
|
d1bb7159b8 | ||
|
|
b58cfe6324 | ||
|
|
7a0c43436f | ||
|
|
708e21951f | ||
|
|
8198574087 | ||
|
|
6c9b92400e | ||
|
|
8091db37e8 | ||
|
|
e66b67dedc | ||
|
|
a2012dcff8 | ||
|
|
08649dd1eb | ||
|
|
52f76380c7 | ||
|
|
1f63bcbbd0 | ||
|
|
3aa5607a3a | ||
|
|
eaebeb87c9 | ||
|
|
808b94468e | ||
|
|
60e6c8bcb2 | ||
|
|
891f0fd599 | ||
|
|
6154de0d2c | ||
|
|
cae9dbf5d1 | ||
|
|
ae8ef305fa | ||
|
|
9b3ca525ee | ||
|
|
38ee942d8f | ||
|
|
957329d515 | ||
|
|
6063256439 | ||
|
|
1c64646393 | ||
|
|
259b3dca1b | ||
|
|
6a673e6aea | ||
|
|
f606e33415 | ||
|
|
09de91940e | ||
|
|
3d485f0706 | ||
|
|
7eaa9b8aec | ||
|
|
faa4b9700a | ||
|
|
dea739ff07 | ||
|
|
69cc45bf5c | ||
|
|
347aa4d546 | ||
|
|
b4855b25c4 | ||
|
|
d518675e03 | ||
|
|
9b59ae2b73 | ||
|
|
f67573315e | ||
|
|
501f57499e | ||
|
|
2916cb6fd9 | ||
|
|
e553539b2a | ||
|
|
3da773c27f | ||
|
|
b923be5e94 | ||
|
|
c9ab184c65 | ||
|
|
bc45a16f40 | ||
|
|
8b6642b56d | ||
|
|
d6807cb471 | ||
|
|
f9064428c5 | ||
|
|
a443e5f0ad | ||
|
|
24413c53dd | ||
|
|
8b5c3746f8 | ||
|
|
9df625c44d | ||
|
|
54ff0446c6 | ||
|
|
0f5dfb89ad | ||
|
|
e3b27768d2 | ||
|
|
580283433e | ||
|
|
f4ac2b92e7 | ||
|
|
e35584843d | ||
|
|
3335e87ef4 | ||
|
|
abde67e5df | ||
|
|
2ba3643a0c | ||
|
|
89ae2012c7 | ||
|
|
8a209d643f | ||
|
|
1a28ec7ea4 | ||
|
|
5fe41fc896 | ||
|
|
4f9ff1ae81 | ||
|
|
d97ddf1eec | ||
|
|
9facf4a067 | ||
|
|
de4fe132a7 | ||
|
|
d7d0733177 | ||
|
|
e614e291a2 | ||
|
|
dd9a3bfeeb | ||
|
|
83229ace63 | ||
|
|
6724fa804b | ||
|
|
630b98520f | ||
|
|
1c0341de51 | ||
|
|
d5aa74d9af | ||
|
|
343cc33bbe | ||
|
|
b1edbed6a5 | ||
|
|
066e553f84 | ||
|
|
61b54125be | ||
|
|
3276703edd | ||
|
|
f9265169fd | ||
|
|
2361880c45 | ||
|
|
3ad87df154 | ||
|
|
3c58788e37 | ||
|
|
310b5f058a | ||
|
|
a33705e348 | ||
|
|
3fca82321e | ||
|
|
790f431df0 | ||
|
|
0d22bf8418 | ||
|
|
1eecfb6b3a | ||
|
|
b8c1c6c8de | ||
|
|
6503fb4a04 | ||
|
|
bab14b7053 | ||
|
|
2d4b3341f6 | ||
|
|
6f8a3b9261 | ||
|
|
8edefffbc5 | ||
|
|
59b425fd5c | ||
|
|
f2267e2af0 | ||
|
|
c26acfdb42 | ||
|
|
f925f036c9 | ||
|
|
2c810faeeb | ||
|
|
6675358e85 | ||
|
|
262a730534 | ||
|
|
4b6872aa42 | ||
|
|
3283d38867 | ||
|
|
4204ff367e | ||
|
|
51e646690c | ||
|
|
85607f7846 | ||
|
|
41a5bcc3a1 | ||
|
|
84c8a9be9b | ||
|
|
62b2fe3e2f | ||
|
|
f5fdd79c7f | ||
|
|
14752ccb0c | ||
|
|
541c166863 | ||
|
|
270f62bbb2 | ||
|
|
8290d853c9 | ||
|
|
b0a67300cc | ||
|
|
0b9749f3a4 | ||
|
|
3ad3e19392 | ||
|
|
ed71adac7e | ||
|
|
8d95c92bfb | ||
|
|
41ab94978f | ||
|
|
26e198b7d8 | ||
|
|
d16746ab38 | ||
|
|
627c3e20cc | ||
|
|
4d42d4a190 | ||
|
|
ff184822ca | ||
|
|
ddbd6d1e82 | ||
|
|
f6d6478944 | ||
|
|
138c7f2665 | ||
|
|
239ace0c07 | ||
|
|
c1312100aa | ||
|
|
e343eccdc3 | ||
|
|
da5b316358 | ||
|
|
dc8692044c | ||
|
|
4f9ba11489 | ||
|
|
f7914db019 | ||
|
|
11ecaff7db | ||
|
|
d832bbcc70 | ||
|
|
59aed49e98 | ||
|
|
e9f83ca735 | ||
|
|
afa9ad3cde | ||
|
|
01d29ed11e | ||
|
|
8f9ae7e4d5 | ||
|
|
70b048f356 | ||
|
|
5fddd3b104 | ||
|
|
02afbb4000 | ||
|
|
54432485e7 | ||
|
|
26ede2839b | ||
|
|
4b0df1a7ae | ||
|
|
9767e7d3b7 | ||
|
|
4133e7d6d6 | ||
|
|
4f37355a9f | ||
|
|
82fae45656 | ||
|
|
2f09c32d2d | ||
|
|
a16338ce11 | ||
|
|
50d0b1412d | ||
|
|
8941bd1747 | ||
|
|
615dc0c4a3 | ||
|
|
1fb8b2e279 | ||
|
|
0799177cf4 | ||
|
|
1eed61397b | ||
|
|
3f1f7c7ef7 | ||
|
|
8543dda4aa | ||
|
|
68a89b615d | ||
|
|
e9d3f67c5c | ||
|
|
a980390870 | ||
|
|
299781bdba | ||
|
|
f42d3e0536 | ||
|
|
993eb5c90d | ||
|
|
f8f8319324 | ||
|
|
12d84c43c9 |
28
.github/workflows/ci.yml
vendored
28
.github/workflows/ci.yml
vendored
@@ -4,18 +4,19 @@ on:
|
||||
branches:
|
||||
- master
|
||||
- tiddlywiki-com
|
||||
- multi-wiki-support
|
||||
env:
|
||||
NODE_VERSION: "22"
|
||||
NODE_VERSION: "23"
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: "${{ env.NODE_VERSION }}"
|
||||
- run: "./bin/ci-test.sh"
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: always()
|
||||
with:
|
||||
name: playwright-report
|
||||
@@ -30,8 +31,8 @@ jobs:
|
||||
TW5_BUILD_MAIN_EDITION: "./editions/prerelease"
|
||||
TW5_BUILD_OUTPUT: "./output/prerelease"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: "${{ env.NODE_VERSION }}"
|
||||
- run: "./bin/ci-pre-build.sh"
|
||||
@@ -62,8 +63,8 @@ jobs:
|
||||
TW5_BUILD_OUTPUT: "./output"
|
||||
TW5_BUILD_ARCHIVE: "./output"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: "${{ env.NODE_VERSION }}"
|
||||
- run: "./bin/ci-pre-build.sh"
|
||||
@@ -82,3 +83,14 @@ jobs:
|
||||
- run: "./bin/build-tw-org.sh"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUBPUSHTOKEN }}
|
||||
build-mws-tiddlywiki-com:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.ref == 'refs/heads/multi-wiki-support'
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: "${{ env.NODE_VERSION }}"
|
||||
- run: "./bin/build-mws-site.sh"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUBPUSHTOKEN }}
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -5,7 +5,9 @@
|
||||
tmp/
|
||||
output/
|
||||
node_modules/
|
||||
store/
|
||||
/test-results/
|
||||
/playwright-report/
|
||||
/playwright/.cache/
|
||||
$__StoryList.tid
|
||||
/editions/test/test-store/*
|
||||
4
TODO BEFORE MERGING THIS PR.md
Normal file
4
TODO BEFORE MERGING THIS PR.md
Normal file
@@ -0,0 +1,4 @@
|
||||
The `multi-wiki-support` branch includes some changes that are not intended to be merged into the `master` branch:
|
||||
|
||||
* Readme update (see `editions/tw5.com/tiddlers/readme/ReadMe.tid`)
|
||||
* Remove `multiwikiserver` plugin from `readme-bld.sh` (see `bin/readme-bld.sh`)
|
||||
97
bin/build-mws-site.sh
Executable file
97
bin/build-mws-site.sh
Executable file
@@ -0,0 +1,97 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Build mws.tiddlywiki.com assets.
|
||||
|
||||
# Default to the version of TiddlyWiki installed in this repo
|
||||
|
||||
if [ -z "$MWSTWCOM_BUILD_TIDDLYWIKI" ]; then
|
||||
MWSTWCOM_BUILD_TIDDLYWIKI=./tiddlywiki.js
|
||||
fi
|
||||
|
||||
echo "Using MWSTWCOM_BUILD_TIDDLYWIKI as [$MWSTWCOM_BUILD_TIDDLYWIKI]"
|
||||
|
||||
# Set up the build details
|
||||
|
||||
if [ -z "$MWSTWCOM_BUILD_DETAILS" ]; then
|
||||
MWSTWCOM_BUILD_DETAILS="$(git symbolic-ref --short HEAD)-$(git rev-parse HEAD) from $(git remote get-url origin)"
|
||||
fi
|
||||
|
||||
echo "Using MWSTWCOM_BUILD_DETAILS as [$MWSTWCOM_BUILD_DETAILS]"
|
||||
|
||||
if [ -z "$MWSTWCOM_BUILD_COMMIT" ]; then
|
||||
MWSTWCOM_BUILD_COMMIT="$(git rev-parse HEAD)"
|
||||
fi
|
||||
|
||||
echo "Using MWSTWCOM_BUILD_COMMIT as [$MWSTWCOM_BUILD_COMMIT]"
|
||||
|
||||
# Set up the build output directory
|
||||
|
||||
if [ -z "$MWSTWCOM_BUILD_OUTPUT" ]; then
|
||||
MWSTWCOM_BUILD_OUTPUT=$(mktemp -d)
|
||||
fi
|
||||
|
||||
mkdir -p $MWSTWCOM_BUILD_OUTPUT
|
||||
|
||||
if [ ! -d "$MWSTWCOM_BUILD_OUTPUT" ]; then
|
||||
echo 'A valid MWSTWCOM_BUILD_OUTPUT environment variable must be set'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Using MWSTWCOM_BUILD_OUTPUT as [$MWSTWCOM_BUILD_OUTPUT]"
|
||||
|
||||
# Pull existing GitHub pages content
|
||||
|
||||
git clone --depth=1 --branch=main "https://github.com/TiddlyWiki/mws.tiddlywiki.com-gh-pages.git" $MWSTWCOM_BUILD_OUTPUT
|
||||
|
||||
# Make the CNAME file that GitHub Pages requires
|
||||
|
||||
echo "mws.tiddlywiki.com" > $MWSTWCOM_BUILD_OUTPUT/CNAME
|
||||
|
||||
# Delete any existing static content
|
||||
|
||||
mkdir -p $MWSTWCOM_BUILD_OUTPUT/static
|
||||
rm $MWSTWCOM_BUILD_OUTPUT/static/*
|
||||
|
||||
# Put the build details into a .tid file so that it can be included in each build (deleted at the end of this script)
|
||||
|
||||
echo -e -n "title: $:/build\ncommit: $MWSTWCOM_BUILD_COMMIT\n\n$MWSTWCOM_BUILD_DETAILS\n" > $MWSTWCOM_BUILD_OUTPUT/build.tid
|
||||
|
||||
######################################################
|
||||
#
|
||||
# mws.tiddlywiki.com distribution
|
||||
#
|
||||
######################################################
|
||||
|
||||
# /index.html Main site
|
||||
# /favicon.ico Favicon for main site
|
||||
# /static.html Static rendering of default tiddlers
|
||||
# /alltiddlers.html Static rendering of all tiddlers
|
||||
# /static/* Static single tiddlers
|
||||
# /static/static.css Static stylesheet
|
||||
# /static/favicon.ico Favicon for static pages
|
||||
node $MWSTWCOM_BUILD_TIDDLYWIKI \
|
||||
editions/multiwikidocs \
|
||||
--verbose \
|
||||
--version \
|
||||
--load $MWSTWCOM_BUILD_OUTPUT/build.tid \
|
||||
--output $MWSTWCOM_BUILD_OUTPUT \
|
||||
--build favicon static index \
|
||||
|| exit 1
|
||||
|
||||
# Delete the temporary build tiddler
|
||||
|
||||
rm $MWSTWCOM_BUILD_OUTPUT/build.tid || exit 1
|
||||
|
||||
# Push output back to GitHub
|
||||
|
||||
# Exit script immediately if any command fails
|
||||
set -e
|
||||
|
||||
pushd $MWSTWCOM_BUILD_OUTPUT
|
||||
git config --global user.email "actions@github.com"
|
||||
git config --global user.name "GitHub Actions"
|
||||
git add -A .
|
||||
git commit --message "GitHub build: $GITHUB_RUN_NUMBER of $TW5_BUILD_BRANCH ($(date +'%F %T %Z'))"
|
||||
git remote add deploy "https://$GH_TOKEN@github.com/TiddlyWiki/mws.tiddlywiki.com-gh-pages.git" &>/dev/null
|
||||
git push deploy main &>/dev/null
|
||||
popd
|
||||
@@ -105,7 +105,6 @@ 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
|
||||
@@ -118,7 +117,7 @@ node $TW5_BUILD_TIDDLYWIKI \
|
||||
--version \
|
||||
--load $TW5_BUILD_OUTPUT/build.tid \
|
||||
--output $TW5_BUILD_OUTPUT \
|
||||
--build favicon static index external-js \
|
||||
--build favicon static index \
|
||||
|| exit 1
|
||||
|
||||
# /empty.html Empty
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
# test TiddlyWiki5 for tiddlywiki.com
|
||||
|
||||
npm install
|
||||
|
||||
node ./tiddlywiki.js \
|
||||
./editions/test \
|
||||
--verbose \
|
||||
|
||||
@@ -10,6 +10,7 @@ fi
|
||||
|
||||
# tw5.com readmes
|
||||
node $TW5_BUILD_TIDDLYWIKI \
|
||||
+plugins/tiddlywiki/multiwikiserver \
|
||||
editions/tw5.com \
|
||||
--verbose \
|
||||
--output . \
|
||||
|
||||
12
boot/boot.js
12
boot/boot.js
@@ -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: "application/json"});
|
||||
var blob = new Blob([text], {type: "text/html"});
|
||||
link.setAttribute("href", URL.createObjectURL(blob));
|
||||
} else {
|
||||
link.setAttribute("href","data:application/json," + encodeURIComponent(text));
|
||||
link.setAttribute("href","data:text/html," + encodeURIComponent(text));
|
||||
}
|
||||
link.setAttribute("download","emergency-tiddlers-" + (new Date()) + ".json");
|
||||
document.body.appendChild(link);
|
||||
@@ -2463,15 +2463,13 @@ $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("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("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("audio/ogg","base64",".ogg");
|
||||
$tw.utils.registerFileType("audio/mp4","base64",[".mp4",".m4a"]);
|
||||
$tw.utils.registerFileType("video/ogg","base64",[".ogm",".ogv",".ogg"]);
|
||||
|
||||
@@ -5,3 +5,7 @@ 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]]
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
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>
|
||||
13
core/language/en-GB/icon.tid
Normal file
13
core/language/en-GB/icon.tid
Normal file
@@ -0,0 +1,13 @@
|
||||
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>
|
||||
@@ -38,6 +38,13 @@ Commander.prototype.log = function(str) {
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
Clear pending commands
|
||||
*/
|
||||
Commander.prototype.clearCommands = function() {
|
||||
this.commandTokens = this.commandTokens.slice(0,this.nextToken);
|
||||
};
|
||||
|
||||
/*
|
||||
Write a string if verbose flag is set
|
||||
*/
|
||||
|
||||
@@ -16,7 +16,7 @@ var Server = require("$:/core/modules/server/server.js").Server;
|
||||
|
||||
exports.info = {
|
||||
name: "listen",
|
||||
synchronous: true,
|
||||
synchronous: false,
|
||||
namedParameterMode: true,
|
||||
mandatoryParameters: []
|
||||
};
|
||||
@@ -38,7 +38,11 @@ Command.prototype.execute = function() {
|
||||
wiki: this.commander.wiki,
|
||||
variables: self.params
|
||||
});
|
||||
var nodeServer = this.server.listen();
|
||||
var nodeServer = this.server.listen(null,null,null,{
|
||||
callback: function() {
|
||||
self.callback();
|
||||
}
|
||||
});
|
||||
$tw.hooks.invokeHook("th-server-command-post-start",this.server,nodeServer,"tiddlywiki");
|
||||
return null;
|
||||
};
|
||||
|
||||
37
core/modules/commands/quit.js
Normal file
37
core/modules/commands/quit.js
Normal file
@@ -0,0 +1,37 @@
|
||||
/*\
|
||||
title: $:/core/modules/commands/quit.js
|
||||
type: application/javascript
|
||||
module-type: command
|
||||
|
||||
Immediately ends the TiddlyWiki process
|
||||
|
||||
\*/
|
||||
(function(){
|
||||
|
||||
/*jslint node: true, browser: true */
|
||||
/*global $tw: false */
|
||||
"use strict";
|
||||
|
||||
exports.info = {
|
||||
name: "quit",
|
||||
synchronous: true
|
||||
};
|
||||
|
||||
var Command = function(params,commander,callback) {
|
||||
var self = this;
|
||||
this.params = params;
|
||||
this.commander = commander;
|
||||
this.callback = callback;
|
||||
};
|
||||
|
||||
Command.prototype.execute = function() {
|
||||
// Clear any pending commands
|
||||
this.commander.clearCommands();
|
||||
// We don't actually quit, we just issue the "th-quit" hook to give listeners a chance to exit
|
||||
$tw.hooks.invokeHook("th-quit");
|
||||
return null;
|
||||
};
|
||||
|
||||
exports.Command = Command;
|
||||
|
||||
})();
|
||||
@@ -17,24 +17,19 @@ Export our filter function
|
||||
*/
|
||||
exports.function = function(source,operator,options) {
|
||||
var functionName = operator.operands[0],
|
||||
params = [],
|
||||
results;
|
||||
params = [];
|
||||
$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) {
|
||||
results = variableInfo.resultList ? variableInfo.resultList : [variableInfo.text];
|
||||
return variableInfo.resultList ? variableInfo.resultList : [variableInfo.text];
|
||||
}
|
||||
// Return the input list if the function wasn't found
|
||||
if(!results) {
|
||||
results = [];
|
||||
source(function(tiddler,title) {
|
||||
results.push(title);
|
||||
});
|
||||
}
|
||||
// console.log(`function ${functionName} with params ${JSON.stringify(params)} results: ${JSON.stringify(results)}`);
|
||||
var results = [];
|
||||
source(function(tiddler,title) {
|
||||
results.push(title);
|
||||
});
|
||||
return results;
|
||||
};
|
||||
|
||||
|
||||
@@ -128,7 +128,7 @@ exports.minall = makeNumericReducingOperator(
|
||||
exports.median = makeNumericArrayOperator(
|
||||
function(values) {
|
||||
var len = values.length, median;
|
||||
values.sort(function(a,b) {return a-b});
|
||||
values.sort();
|
||||
if(len % 2) {
|
||||
// Odd, return the middle number
|
||||
median = values[(len - 1) / 2];
|
||||
|
||||
@@ -40,7 +40,6 @@ 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;
|
||||
|
||||
|
||||
@@ -46,10 +46,8 @@ 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) {
|
||||
if(change.normal) {
|
||||
var tiddler = self.wiki.getTiddler(title);
|
||||
iterator(tiddler,title);
|
||||
}
|
||||
var tiddler = self.wiki.getTiddler(title);
|
||||
iterator(tiddler,title);
|
||||
});
|
||||
});
|
||||
// Adjust the number of changes
|
||||
@@ -185,7 +183,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, type: variables.type}})) {
|
||||
if(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {
|
||||
this.logger.log("Saving wiki with method",method,"through saver",saver.info.name);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@ 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) {
|
||||
@@ -33,16 +32,13 @@ 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: type});
|
||||
var blob = new Blob([text], {type: "text/html"});
|
||||
link.setAttribute("href", URL.createObjectURL(blob));
|
||||
} else {
|
||||
link.setAttribute("href","data:" + type + "," + encodeURIComponent(text));
|
||||
link.setAttribute("href","data:text/html," + encodeURIComponent(text));
|
||||
}
|
||||
link.setAttribute("download",filename);
|
||||
document.body.appendChild(link);
|
||||
|
||||
@@ -364,6 +364,11 @@ Server.prototype.listen = function(port,host,prefix) {
|
||||
}
|
||||
// Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port)
|
||||
server.on("listening",function() {
|
||||
// Stop listening when we get the "th-quit" hook
|
||||
$tw.hooks.addHook("th-quit",function() {
|
||||
server.close();
|
||||
});
|
||||
// Log listening details
|
||||
var address = server.address(),
|
||||
url = self.protocol + "://" + (address.family === "IPv6" ? "[" + address.address + "]" : address.address) + ":" + address.port + prefix;
|
||||
$tw.utils.log("Serving on " + url,"brown/orange");
|
||||
|
||||
@@ -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], true);
|
||||
$tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title]);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,9 +77,8 @@ 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,
|
||||
plainText: event.paramObject && event.paramObject.plainText
|
||||
},event.paramObject && event.paramObject.type);
|
||||
failureNotification: event.paramObject && event.paramObject.failureNotification
|
||||
});
|
||||
});
|
||||
// Install the tm-focus-selector message
|
||||
$tw.rootWidget.addEventListener("tm-focus-selector",function(event) {
|
||||
|
||||
@@ -257,7 +257,11 @@ Save an incoming tiddler in the store, and updates the associated tiddlerInfo
|
||||
Syncer.prototype.storeTiddler = function(tiddlerFields) {
|
||||
// Save the tiddler
|
||||
var tiddler = new $tw.Tiddler(tiddlerFields);
|
||||
this.wiki.addTiddler(tiddler);
|
||||
// Only save the tiddler if it has changed
|
||||
var existingTiddler = this.wiki.getTiddler(tiddlerFields.title);
|
||||
if(!existingTiddler || !existingTiddler.isEqual(tiddler)) {
|
||||
this.wiki.addTiddler(tiddler);
|
||||
}
|
||||
// Save the tiddler revision and changeCount details
|
||||
this.tiddlerInfo[tiddlerFields.title] = {
|
||||
revision: this.getTiddlerRevision(tiddlerFields.title),
|
||||
@@ -556,6 +560,7 @@ SaveTiddlerTask.prototype.run = function(callback) {
|
||||
// Invoke the callback
|
||||
callback(null);
|
||||
},{
|
||||
syncer: self.syncer,
|
||||
tiddlerInfo: self.syncer.tiddlerInfo[self.title]
|
||||
});
|
||||
} else {
|
||||
@@ -586,6 +591,7 @@ DeleteTiddlerTask.prototype.run = function(callback) {
|
||||
// Invoke the callback
|
||||
callback(null);
|
||||
},{
|
||||
syncer: self.syncer,
|
||||
tiddlerInfo: self.syncer.tiddlerInfo[this.title]
|
||||
});
|
||||
};
|
||||
@@ -614,6 +620,8 @@ LoadTiddlerTask.prototype.run = function(callback) {
|
||||
}
|
||||
// Invoke the callback
|
||||
callback(null);
|
||||
},{
|
||||
syncer: self.syncer
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -40,10 +40,10 @@ exports.getFieldString = function(field,defaultValue) {
|
||||
};
|
||||
|
||||
/*
|
||||
Get the value of a field as an array / list
|
||||
Get the value of a field as a list
|
||||
*/
|
||||
exports.getFieldList = function(field) {
|
||||
var value = this.getFieldString(field,null);
|
||||
var value = this.fields[field];
|
||||
// Check for a missing field
|
||||
if(value === undefined || value === null) {
|
||||
return [];
|
||||
|
||||
@@ -268,10 +268,9 @@ exports.copyStyles = function(srcDomNode,dstDomNode) {
|
||||
/*
|
||||
Copy plain text to the clipboard on browsers that support it
|
||||
*/
|
||||
exports.copyToClipboard = function(text,options,type) {
|
||||
var text = text || "";
|
||||
var options = options || {};
|
||||
var type = type || "text/plain";
|
||||
exports.copyToClipboard = function(text,options) {
|
||||
options = options || {};
|
||||
text = text || "";
|
||||
var textArea = document.createElement("textarea");
|
||||
textArea.style.position = "fixed";
|
||||
textArea.style.top = 0;
|
||||
@@ -284,16 +283,10 @@ exports.copyToClipboard = function(text,options,type) {
|
||||
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");
|
||||
|
||||
@@ -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,$tw.utils.extend({},self.variables,{
|
||||
self.wiki.invokeActionString(self.progressActions,undefined,{
|
||||
lengthComputable: lengthComputable ? "yes" : "no",
|
||||
loaded: loaded,
|
||||
total: total
|
||||
}),{parentWidget: $tw.rootWidget});
|
||||
},{parentWidget: $tw.rootWidget});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -157,7 +157,7 @@ CheckboxWidget.prototype.getValue = function() {
|
||||
if(this.checkboxTag) {
|
||||
return false;
|
||||
}
|
||||
if(this.checkboxField || this.checkboxIndex) {
|
||||
if(this.checkboxField) {
|
||||
if(this.checkboxDefault === this.checkboxChecked) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -43,6 +43,15 @@ 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
|
||||
@@ -80,8 +89,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 the editor type has changed
|
||||
if(changedAttributes.tiddler || changedAttributes.field || (this.getEditorType() !== this.editorType)) {
|
||||
// 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)) {
|
||||
this.refreshSelf();
|
||||
return true;
|
||||
} else {
|
||||
|
||||
@@ -24,10 +24,6 @@ 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;
|
||||
|
||||
})();
|
||||
|
||||
@@ -23,21 +23,15 @@ 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();
|
||||
this.computeAttributes({filterFn: function(name) {
|
||||
// Only compute our own attributes which start with a single dollar
|
||||
return name.charAt(0) === "$" && name.charAt(1) !== "$";
|
||||
}});
|
||||
this.execute();
|
||||
this.renderChildren(parent,nextSibling);
|
||||
};
|
||||
|
||||
@@ -163,4 +163,4 @@ ImageWidget.prototype.refresh = function(changedTiddlers) {
|
||||
|
||||
exports.image = ImageWidget;
|
||||
|
||||
})();
|
||||
})();
|
||||
@@ -107,7 +107,6 @@ 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);
|
||||
|
||||
@@ -141,15 +141,12 @@ 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,isShadow) {
|
||||
exports.enqueueTiddlerEvent = function(title,isDeleted) {
|
||||
// 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)) {
|
||||
|
||||
@@ -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-bg-2>>
|
||||
diff-delete-foreground: <<colour flexoki-paper>>
|
||||
diff-equal-background:
|
||||
diff-equal-foreground: inherit
|
||||
diff-insert-background: <<colour flexoki-gr>>
|
||||
diff-insert-foreground: <<colour flexoki-bg-2>>
|
||||
diff-insert-foreground: <<colour flexoki-paper>>
|
||||
diff-invisible-background: <<colour flexoki-ye>>
|
||||
diff-invisible-foreground: <<colour flexoki-bg-2>>
|
||||
diff-invisible-foreground: <<colour flexoki-paper>>
|
||||
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-yellow-900>>
|
||||
highlight-foreground: inherit
|
||||
highlight-background: <<colour flexoki-cyan-950>>
|
||||
highlight-foreground: <<colour flexoki-cyan-400>>
|
||||
menubar-background: <<colour primary>>
|
||||
menubar-foreground: <<colour flexoki-paper>>
|
||||
message-background: <<colour background>>
|
||||
|
||||
@@ -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-yellow-100>>
|
||||
highlight-background: <<colour flexoki-cyan-050>>
|
||||
highlight-foreground: inherit
|
||||
menubar-background: <<colour primary>>
|
||||
menubar-foreground: <<colour flexoki-paper>>
|
||||
|
||||
@@ -2,6 +2,5 @@ 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"/>
|
||||
|
||||
@@ -2,6 +2,5 @@ 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"/>
|
||||
|
||||
@@ -2,7 +2,6 @@ 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()
|
||||
|
||||
@@ -5,7 +5,6 @@ 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}}
|
||||
|
||||
@@ -5,7 +5,6 @@ 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}}
|
||||
|
||||
@@ -7,7 +7,11 @@ 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]] %>
|
||||
{{$:/core/images/language}}
|
||||
<span class="tc-image-button">
|
||||
<$set name="languagePluginTitle" value={{$:/language}}>
|
||||
<$image source=`$(languagePluginTitle)$/icon`/>
|
||||
</$set>
|
||||
</span>
|
||||
<%endif%>
|
||||
<%if [<tv-config-toolbar-text>match[yes]] %>
|
||||
<span class="tc-btn-text"><$text text={{$:/language/Buttons/Language/Caption}}/></span>
|
||||
|
||||
@@ -5,7 +5,6 @@ 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}}
|
||||
|
||||
@@ -4,17 +4,10 @@ caption: {{$:/core/images/save-button-dynamic}} {{$:/language/Buttons/SaveWiki/C
|
||||
description: {{$:/language/Buttons/SaveWiki/Hint}}
|
||||
|
||||
\whitespace trim
|
||||
\procedure saveActions()
|
||||
<$button tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>
|
||||
<$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}}
|
||||
|
||||
@@ -5,7 +5,6 @@ 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}}
|
||||
|
||||
@@ -1,12 +1,25 @@
|
||||
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>> lang={{!!name}}>
|
||||
<$set name="cls" filter="[all[current]field:title{$:/language}]" value="tc-chooser-item tc-chosen" emptyValue="tc-chooser-item"><div class=<<cls>>>
|
||||
<$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>
|
||||
 
|
||||
<$view field="description">
|
||||
<$view field="name">
|
||||
<$view field="title"/>
|
||||
|
||||
@@ -3,11 +3,9 @@ tags: $:/tags/Macro
|
||||
|
||||
\whitespace trim
|
||||
|
||||
\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>>
|
||||
\procedure copy-to-clipboard(src,class:"tc-btn-invisible",style)
|
||||
<$button message="tm-copy-to-clipboard"
|
||||
param=<<src>>
|
||||
class=<<class>>
|
||||
style=<<style>>
|
||||
tooltip={{$:/language/Buttons/CopyToClipboard/Hint}}
|
||||
@@ -17,12 +15,12 @@ tags: $:/tags/Macro
|
||||
<$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>
|
||||
</span>
|
||||
</$button>
|
||||
\end copy-to-clipboard
|
||||
\end
|
||||
|
||||
\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>>/>
|
||||
\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>>/>
|
||||
</div>
|
||||
</div>
|
||||
\end
|
||||
|
||||
@@ -39,7 +39,6 @@ tags: $:/tags/Macro
|
||||
$param=<<currentTiddler>>
|
||||
exportFilter=<<exportFilter>>
|
||||
filename={{{ [<baseFilename>addsuffix{!!extension}] }}}
|
||||
type={{!!file-type}}
|
||||
/>
|
||||
<$action-deletetiddler $tiddler=<<qualify "$:/state/popup/export">>/>
|
||||
<$transclude field="description"/>
|
||||
|
||||
@@ -102,11 +102,7 @@ tags: $:/tags/Macro
|
||||
<$genesis $type=<<elementTag>>>
|
||||
<$transclude tiddler=<<itemTemplate>>>
|
||||
<$link to={{!!title}}>
|
||||
<$let tv-wikilinks="no">
|
||||
<$transclude field="caption">
|
||||
<$view field="title"/>
|
||||
</$transclude>
|
||||
</$let>
|
||||
<$view field="title"/>
|
||||
</$link>
|
||||
</$transclude>
|
||||
</$genesis>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
title: $:/core/macros/toc
|
||||
tags: $:/tags/Macro
|
||||
|
||||
|
||||
\define toc-open-icon() $:/core/images/down-arrow
|
||||
\define toc-closed-icon() $:/core/images/right-arrow
|
||||
|
||||
@@ -120,7 +121,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$] -[subfilter<__exclude__>] +[limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>">
|
||||
<$list filter="[all[current]tagging[]$sort$limit[1]] -[subfilter<__exclude__>]" 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>> />
|
||||
@@ -147,7 +148,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$] -[subfilter<__exclude__>] +[limit[1]]" 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$limit[1]] -[subfilter<__exclude__>]" 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>> />
|
||||
|
||||
@@ -3,7 +3,7 @@ title: $:/snippets/paletteswitcher
|
||||
\whitespace trim
|
||||
<$linkcatcher to="$:/palette">
|
||||
<div class="tc-chooser">
|
||||
<$list filter="[all[shadows+tiddlers]tag[$:/tags/Palette]!is[draft]sort[name]]">
|
||||
<$list filter="[all[shadows+tiddlers]tag[$:/tags/Palette]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}}>
|
||||
|
||||
@@ -1,9 +1,33 @@
|
||||
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 style.height="400px" style.overflowY="auto">
|
||||
{{$:/snippets/languageswitcher}}
|
||||
<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>
|
||||
|
||||
Find out how to [[Get Started]].
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
"de-DE",
|
||||
"el-GR",
|
||||
"en-US",
|
||||
"en-PH",
|
||||
"es-ES",
|
||||
"fa-IR",
|
||||
"fr-FR",
|
||||
@@ -35,15 +34,12 @@
|
||||
"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",
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
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(!"
|
||||
```
|
||||
|
||||
引用符は値の部分だけでなく、名前=値のペア全体を括ることに注意してください。
|
||||
@@ -1,42 +0,0 @@
|
||||
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]]を参照。
|
||||
@@ -1,21 +0,0 @@
|
||||
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]]を参照してください
|
||||
@@ -1,31 +0,0 @@
|
||||
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="""
|
||||
"#" {("テキスト" | "ホワイトスペース")} "改行"
|
||||
"""/>
|
||||
@@ -1,38 +0,0 @@
|
||||
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}}
|
||||
@@ -1,112 +0,0 @@
|
||||
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 <pre> tag.\nNote how the body is "HTML encoded" 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>
|
||||
```
|
||||
@@ -1,37 +0,0 @@
|
||||
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
|
||||
```
|
||||
@@ -1,19 +0,0 @@
|
||||
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`
|
||||
@@ -1,31 +0,0 @@
|
||||
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の静的レンダリングへのリンクとしてレンダリングされます。
|
||||
@@ -1,16 +0,0 @@
|
||||
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を作成してクライアントを設定します
|
||||
|
||||
|
||||
27
editions/ja-JP/tiddlers/languages/LanguageGallery.tid
Normal file
27
editions/ja-JP/tiddlers/languages/LanguageGallery.tid
Normal file
@@ -0,0 +1,27 @@
|
||||
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>
|
||||
@@ -1,27 +0,0 @@
|
||||
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
|
||||
```
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
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`フィールドによって決定されるデフォルトの拡張子が使用されます。
|
||||
@@ -1,27 +0,0 @@
|
||||
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
|
||||
```
|
||||
@@ -1,16 +0,0 @@
|
||||
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を操作できるようになります。
|
||||
|
||||
最新のコードを確実に取得するために、クローンを定期的に更新してください。
|
||||
@@ -1,23 +0,0 @@
|
||||
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}}
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
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]]も参照してください。"/>
|
||||
@@ -1,52 +0,0 @@
|
||||
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`エディションコンテンツを提供します。
|
||||
@@ -1,24 +0,0 @@
|
||||
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]]">>
|
||||
@@ -1,33 +0,0 @@
|
||||
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]]で確認できます"/>
|
||||
@@ -1,19 +0,0 @@
|
||||
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
|
||||
```
|
||||
@@ -1,43 +0,0 @@
|
||||
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]]を参照してください。
|
||||
@@ -1,25 +0,0 @@
|
||||
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]]も参照してください。
|
||||
@@ -1,172 +0,0 @@
|
||||
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/" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
@@ -1,60 +0,0 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -1,12 +0,0 @@
|
||||
created: 20150412185300152
|
||||
modified: 20241227104147434
|
||||
original-modified: 20150412185427211
|
||||
tags: TableOfContents
|
||||
title: Platforms
|
||||
ja-title: プラットフォーム
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
|
||||
TiddlyWikiはいくつかのプラットフォームで使用できます:
|
||||
|
||||
<<list-links "[tag[Platforms]]">>
|
||||
@@ -1,49 +0,0 @@
|
||||
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構成では''テストとデバッグ''の目的でのみ使用する必要があります
|
||||
@@ -1,2 +0,0 @@
|
||||
title: $:/config/tiddlyweb/host
|
||||
text: $protocol$//$host$/MyApp/
|
||||
@@ -1,7 +0,0 @@
|
||||
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
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"name": "MyStuff",
|
||||
"description": "A description of this wiki",
|
||||
"dependencies": {
|
||||
"sax": "1.2.4",
|
||||
"tiddlywiki": "*"
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
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
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"description": "My wiki",
|
||||
"plugins": [
|
||||
"tiddlywiki/tiddlyweb",
|
||||
"tiddlywiki/filesystem"
|
||||
],
|
||||
"themes": [
|
||||
"tiddlywiki/vanilla",
|
||||
"tiddlywiki/snowwhite"
|
||||
]
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
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
|
||||
@@ -1,25 +0,0 @@
|
||||
<?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>
|
||||
@@ -1,7 +0,0 @@
|
||||
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
|
||||
41
editions/multiwikidocs/tiddlers/Bags and Recipes.tid
Normal file
41
editions/multiwikidocs/tiddlers/Bags and Recipes.tid
Normal file
@@ -0,0 +1,41 @@
|
||||
created: 20240309135835396
|
||||
modified: 20240309142156125
|
||||
title: Bags and Recipes
|
||||
type: text/vnd.tiddlywiki
|
||||
|
||||
The bags and recipes model is a reference architecture for how tiddlers can be shared between multiple wikis. It was first introduced by TiddlyWeb in 2008.
|
||||
|
||||
The principles of bags and recipes can be simply stated:
|
||||
|
||||
# Tiddlers are stored in named "bags"
|
||||
# Bags have access controls that determines which users can read or write to them
|
||||
# Recipes are named lists of bags, ordered from lowest priority to highest
|
||||
# The tiddlers within a recipe are accumulated in turn from each bag in the recipe in order of increasing priority. Thus, if there are multiple tiddlers with the same title in different bags then the one from the highest priority bag will be used as the recipe tiddler
|
||||
# Wikis are composed by splicing the tiddlers from the corresponding recipe into the standard TW5 HTML template
|
||||
|
||||
A very simple example of the recipe/bag model might be for a single user who maintains the following bags:
|
||||
|
||||
* ''recipes'' - tiddlers related to cooking recipes
|
||||
* ''work'' - tiddlers related to work
|
||||
* ''app'' - common tiddlers for customising TiddlyWiki
|
||||
|
||||
Those bags would be used with the following recipes:
|
||||
|
||||
* ''recipes'' --> recipes, app - wiki for working with recipes, with common custom components
|
||||
* ''work'' --> work, app - wiki for working with work, with common custom components
|
||||
* ''app'' --> app - wiki for maintaining custom components
|
||||
|
||||
All of this will work dynamically, so changes to the app bag will instantly ripple into the affected hosted wikis.
|
||||
|
||||
A more complex example might be for a teacher working with a group of students:
|
||||
|
||||
* ''student-{name}'' bag for each students work
|
||||
* ''teacher-course'' bag for the coursework, editable by the teacher
|
||||
* ''teacher-tools'' bag for custom tools used by the teacher
|
||||
|
||||
Those bags would be exposed through the following hosted wikis:
|
||||
|
||||
* ''student-{name}'' hosted wiki for each students work, including the coursework material
|
||||
* ''teacher-course'' hosted wiki for the coursework, editable by the teacher
|
||||
* ''teacher'' hosted wiki for the teacher, bringing together all the bags, giving them an overview of all the students work
|
||||
|
||||
15
editions/multiwikidocs/tiddlers/Database Engines.tid
Normal file
15
editions/multiwikidocs/tiddlers/Database Engines.tid
Normal file
@@ -0,0 +1,15 @@
|
||||
title: Database Engines
|
||||
tags: Reference
|
||||
|
||||
MWS uses [[SQLite]] for data storage. It supports choosing between two "database engines" that are based on two different npm modules:
|
||||
|
||||
* [[better-sqlite3|https://www.npmjs.com/package/better-sqlite3]] is written partially in C/C++ and so requires compilation for the target platform
|
||||
* [[node-sqlite3-wasm|https://www.npmjs.com/package/node-sqlite3-wasm]] is written entirely in JavaScript and does not require compilation, but does require a WebAssembly-capable Node.js host. This is not currently possible on some platforms such as iOS/iPadOS
|
||||
|
||||
By default `npm install` will install both database engines. By default it will use `better-sqlite3`. To switch to using `node-sqlite3-wasm`, set the system configuration tiddler `$:/config/MultiWikiServer/Engine` to `wasm` (the default value is `better`). Note that this tiddler resides in the [[Administration Wiki]].
|
||||
|
||||
!! Avoiding Installation Errors
|
||||
|
||||
If you encounter errors during `npm install` related to `gyp` or `prebuild`, you may be able to avoid them by using `node-sqlite3-wasm` instead of `better-sqlite3`. However, it will be necessary to manually install `node-sqlite3-wasm` and its dependencies. This can be done by running the following commands in your terminal:
|
||||
|
||||
<<.copy-code-to-clipboard "npm install node-sqlite3-wasm">>
|
||||
6
editions/multiwikidocs/tiddlers/DefaultTiddlers.tid
Normal file
6
editions/multiwikidocs/tiddlers/DefaultTiddlers.tid
Normal file
@@ -0,0 +1,6 @@
|
||||
title: $:/DefaultTiddlers
|
||||
|
||||
HelloThere
|
||||
Installation
|
||||
Usage
|
||||
Reference
|
||||
19
editions/multiwikidocs/tiddlers/HelloThere.tid
Normal file
19
editions/multiwikidocs/tiddlers/HelloThere.tid
Normal file
@@ -0,0 +1,19 @@
|
||||
title: HelloThere
|
||||
tags: TableOfContents
|
||||
|
||||
!! ~TiddlyWiki is Growing Up
|
||||
|
||||
<span class="tc-float-right">[img width=200 [MWS Banner.png]]</span>
|
||||
~MultiWikiServer is a new development that drastically improves ~TiddlyWiki's capabilities when running as a server under Node.js. It brings ~TiddlyWiki up to par with common web-based tools like ~WordPress or ~MediaWiki by supporting multiple wikis and multiple users at the same time.
|
||||
|
||||
Features under development include:
|
||||
|
||||
* Hosting multiple wikis at once, using the [[Bags and Recipes]] mechanism for sharing data between them
|
||||
* Based on [[SQLite|MWS and SQLite]] for performance and reliability
|
||||
* Robust built-in synchronisation handlers for syncing data to the filesystem
|
||||
* Flexible authentication and authorisation options
|
||||
* Improved handling of file uploads and attachments, allowing gigabyte video files to be uploaded and streamed
|
||||
* Instantaneous synchronisation of changes between the server and all connected clients
|
||||
* Workflow processing on the server, for example to automatically compress images, or to archive webpages
|
||||
|
||||
MWS is currently [[under development at GitHub|https://github.com/TiddlyWiki/TiddlyWiki5/pull/7915]] but it is already functional and usable.
|
||||
19
editions/multiwikidocs/tiddlers/Installation using Git.tid
Normal file
19
editions/multiwikidocs/tiddlers/Installation using Git.tid
Normal file
@@ -0,0 +1,19 @@
|
||||
title: Installation using Git
|
||||
tags: Installation
|
||||
modified: 20241105133737778
|
||||
created: 20241105133737778
|
||||
|
||||
These instructions require basic knowledge both of the terminal and of Git. There are also [[alternative instructions without using Git|Installation]].
|
||||
|
||||
# Clone the code from GitHub with: <<.copy-code-to-clipboard "git clone -b multi-wiki-support --single-branch https://github.com/TiddlyWiki/TiddlyWiki5">>
|
||||
# Open a terminal window and set the current directory to the root of the downloaded folder
|
||||
# Install the dependencies with the command: <<.copy-code-to-clipboard "npm install">>
|
||||
# Start the server with the command: <<.copy-code-to-clipboard "npm start">>
|
||||
# To use MWS, visit http://localhost:8080 in a browser on the same computer
|
||||
# When you have finished using MWS, stop the server with <kbd>ctrl-C</kbd>
|
||||
|
||||
See [[Troubleshooting]] if you encounter any errors.
|
||||
|
||||
To update your copy of MWS with newer changes from ~GitHub, run the following command:
|
||||
|
||||
<<.copy-code-to-clipboard "git pull">>
|
||||
18
editions/multiwikidocs/tiddlers/Installation.tid
Normal file
18
editions/multiwikidocs/tiddlers/Installation.tid
Normal file
@@ -0,0 +1,18 @@
|
||||
title: Installation
|
||||
tags: TableOfContents
|
||||
modified: 20241105133737778
|
||||
created: 20241105133737778
|
||||
|
||||
These instructions require minimal knowledge of the terminal. There are also [[alternative instructions for those using Git|Installation using Git]].
|
||||
|
||||
# Download the code [[direct from GitHub|https://github.com/TiddlyWiki/TiddlyWiki5/archive/refs/pull/7915/head.zip]]
|
||||
# Open a terminal window and set the current directory to the root of the downloaded folder
|
||||
# Install the dependencies with the command: <<.copy-code-to-clipboard "npm install">>
|
||||
# To verify that MWS is working correctly, start the server with the command: <<.copy-code-to-clipboard "npm start">> and then visit http://localhost:8080 in a browser on the same computer
|
||||
# When you have finished using MWS, stop the server with <kbd>ctrl-C</kbd>
|
||||
|
||||
See [[Troubleshooting]] if you encounter any errors.
|
||||
|
||||
|
||||
|
||||
To update your copy of MWS in the future with newer changes will require re-downloading the code, taking care not to lose any changes you might have made.
|
||||
2
editions/multiwikidocs/tiddlers/MWS Architecture.tid
Normal file
2
editions/multiwikidocs/tiddlers/MWS Architecture.tid
Normal file
@@ -0,0 +1,2 @@
|
||||
title: Architecture
|
||||
tags: TableOfContents
|
||||
25
editions/multiwikidocs/tiddlers/MWS and SQLite.tid
Normal file
25
editions/multiwikidocs/tiddlers/MWS and SQLite.tid
Normal file
@@ -0,0 +1,25 @@
|
||||
title: MWS and SQLite
|
||||
tags: Architecture
|
||||
|
||||
! Introduction
|
||||
|
||||
SQLite is a very popular open source embedded SQL database with some [[unusual characteristics|https://www.sqlite.org/different.html]]. It has proved itself to be robust, fast and scalable, and has been widely adopted in a range of applications including web browsers, mobile devices, and embedded systems.
|
||||
|
||||
The "embedded" part means that developers access SQLite as a library of C functions that run as part of a larger application. This contrasts with more familiar database applications like Microsoft's SQL Server or Oracle that are accessed as network services.
|
||||
|
||||
MWS uses SQLite for the tiddler store and associated data. It brings many advantages:
|
||||
|
||||
* ''Performance'': the optimising query engine inside SQLite makes it much faster and more efficient than could be achieved in plain JavaScript. In some cases, it is [[faster than writing directly to the file system||https://www.sqlite.org/fasterthanfs.html]]
|
||||
* ''Reliability'': SQLite uses protocols that [[ensure data integrity and consistency|https://www.sqlite.org/hirely.html]], even when the application crashes
|
||||
* ''Scalability'': SQLite can handle extremely [[large datasets and complex queries|https://www.sqlite.org/limits.html]]
|
||||
* ''Portability'': SQLite databases are stored as [[a single file|https://www.sqlite.org/fileformat.html]] that can be easily copied and moved between systems
|
||||
|
||||
! Misconceptions
|
||||
|
||||
TiddlyWiki 5 has always incorporated a database. Until MWS, that database has always been a custom tiddler database written in JavaScript. Over the years it has been enhanced and optimised with indexes and other database features that have given us reasonably decent performance for a range of common operations.
|
||||
|
||||
In terms of the traditional architecture of TiddlyWiki, MWS uses SQLite as the basis for an internal API that is equivalent to that of the `$tw.Wiki` object: basic CRUD operations on a database of tiddlers stored by their titles.
|
||||
|
||||
In the context of MWS, SQLite is just a fast and efficient equivalent of TiddlyWiki's existing JavaScript database engine. It gives us the option of persisting the database in file storage, but we also retain the option to run the database entirely within memory and rely on a file synchronisation process to save changes as individual `.tid` files in the file system, just as we do today.
|
||||
|
||||
One particular misconception to avoid is the idea that SQLite replaces the folders of `.tid` files that characterise the Node.js configuration of TiddlyWiki. These are separate components with a different purpose. The tiddler files are the result of syncing a database to the filesystem, and that database can be conceptually interchanged between our custom JavaScript database or the new SQLite implementation in MWS.
|
||||
230
editions/multiwikidocs/tiddlers/Reference.tid
Normal file
230
editions/multiwikidocs/tiddlers/Reference.tid
Normal file
@@ -0,0 +1,230 @@
|
||||
title: Reference
|
||||
tags: TableOfContents
|
||||
|
||||
! Authentication & Authorization
|
||||
|
||||
!! Overview
|
||||
|
||||
Our application has transitioned from a conventional username/password authentication system to a more robust Authentication and Authorization implementation. This new system supports multiple user accounts, roles, permissions, and a comprehensive access control list.
|
||||
|
||||
!! Key Features
|
||||
|
||||
# Multiple User Accounts
|
||||
# Role-based Access Control
|
||||
# Granular Permissions
|
||||
# Access Control List (ACL)
|
||||
|
||||
!! Application Access & Security
|
||||
|
||||
!!! Initial Setup
|
||||
When you first launch the Multiwiki Server, it operates in an unauthenticated mode to facilitate initial configuration. During this initial state, the system creates a temporary anonymous administrator account. Upon accessing the landing page, you'll receive a prominent security warning with instructions to establish a permanent ADMIN account. It's crucial to create this account immediately to secure your installation.
|
||||
|
||||
!!! User Types and Permissions
|
||||
|
||||
!!!! Administrator (ADMIN)
|
||||
|
||||
* Full system access and configuration rights
|
||||
* Can create, modify, and delete user accounts
|
||||
* Manages role assignments and permissions
|
||||
* Controls global system settings
|
||||
* Can configure guest access policies
|
||||
* Has complete control over all recipes and tiddlers
|
||||
|
||||
!!!! Regular Users
|
||||
* Custom accounts created by administrators
|
||||
* Permissions determined by assigned roles
|
||||
* Access limited to specific recipes based on role permissions
|
||||
* Can have READ and/or WRITE permissions
|
||||
|
||||
!!!! Guest Users
|
||||
* Default anonymous access level
|
||||
* No inherent permissions
|
||||
* Can only access recipes without Access Control Lists (ACLs)
|
||||
* Read/write capabilities configurable by ADMIN
|
||||
* Useful for public wikis or documentation sites
|
||||
|
||||
!!! Access Control System
|
||||
|
||||
!!!! Recipe-Level Security
|
||||
* Access control is implemented at the recipe level
|
||||
* Each recipe can have its own Access Control List (ACL)
|
||||
* Permissions are granular:
|
||||
** READ: Allows viewing recipe contents
|
||||
** WRITE: Allows modifications to recipe contents
|
||||
|
||||
!!!! Role-Based Access Control (RBAC)
|
||||
* Administrators can create custom roles
|
||||
* Roles can be assigned specific READ/WRITE permissions
|
||||
* Users inherit permissions from their assigned roles
|
||||
* Multiple roles can be assigned to a single user
|
||||
* Provides flexible and scalable access management
|
||||
|
||||
!!!! Permission Inheritance
|
||||
* Users receive combined permissions from all assigned roles
|
||||
* When roles grant different permission levels for the same resource, the higher access level is granted. For example, if one role grants "read" and another grants "write" access to a recipe, the user receives "write" access since it includes all lower-level permissions.
|
||||
* Guest access is overridden by recipe ACLs
|
||||
* When different permission rules conflict, the system follows a "most restrictive wins" principle: if any applicable rule denies access or requires a higher security level, that restriction takes precedence over more permissive rules. This ensures security is maintained even when users have multiple overlapping role assignments or inherited permissions.
|
||||
|
||||
This security model allows for fine-grained control over content access while maintaining flexibility for both private and public wiki deployments.
|
||||
|
||||
!! User Management & Security Architecture
|
||||
|
||||
!!! User Account Management
|
||||
|
||||
Users can be administered through two interfaces:
|
||||
|
||||
# Web-based Administrative Interface
|
||||
#* Accessible only to ADMIN users
|
||||
#* Provides graphical interface for user operations
|
||||
#* Real-time validation and feedback
|
||||
# Command-line Interface (CLI) Tools
|
||||
#* Suitable for automation and scripting
|
||||
#* Enables batch operations
|
||||
#* Useful for system initialization
|
||||
|
||||
Each user account contains the following essential components:
|
||||
|
||||
* ''Username''
|
||||
** Must be unique across the system
|
||||
** Case-sensitive
|
||||
** Used for authentication and audit trails
|
||||
* ''Password''
|
||||
** Stored using secure hashing algorithms
|
||||
** Never stored in plaintext
|
||||
** Subject to complexity requirements
|
||||
* ''Role Assignments''
|
||||
** Multiple roles can be assigned
|
||||
** Inherited permissions from all assigned roles
|
||||
** Dynamic permission calculation based on role combination
|
||||
|
||||
!!! Role & Permission Framework
|
||||
|
||||
!!!! Role Management
|
||||
|
||||
Roles serve as permission containers and provide organized access control. The system includes:
|
||||
|
||||
Built-in Roles:
|
||||
|
||||
* `ADMIN`
|
||||
** Highest privilege level
|
||||
** Full system access
|
||||
** Cannot be modified or deleted
|
||||
** Can create and manage other roles
|
||||
** Controls guest access policies
|
||||
|
||||
* `USER`
|
||||
** Basic access rights
|
||||
** Typically limited to specific recipes
|
||||
|
||||
**Custom Roles (Examples):**
|
||||
|
||||
* `MANAGER`
|
||||
** Intermediate access level
|
||||
** Can manage subset of resources
|
||||
** Custom roles as needed for specific use cases
|
||||
|
||||
!!!! Permission Architecture
|
||||
|
||||
Core Permissions:
|
||||
|
||||
* `READ` Permission
|
||||
** View recipe contents
|
||||
** Access tiddler data
|
||||
** View metadata
|
||||
** Export capabilities
|
||||
|
||||
* `WRITE` Permission
|
||||
** Create new tiddlers
|
||||
** Modify existing content
|
||||
** Delete resources
|
||||
** Manage recipe contents
|
||||
|
||||
**Guest Access:**
|
||||
|
||||
* No default permissions
|
||||
* Access limited to non-ACL recipes
|
||||
* Configurable by ADMIN users
|
||||
* Suitable for public wikis
|
||||
|
||||
!!! Access Control List (ACL) Implementation
|
||||
|
||||
The ACL system provides granular security control through:
|
||||
|
||||
!!!! Entity-Level Control
|
||||
|
||||
* Recipe-based access control
|
||||
* Individual resource protection
|
||||
* Hierarchical permission inheritance
|
||||
|
||||
!!! Authentication Process Flow
|
||||
|
||||
* Initial Authentication
|
||||
** User submits credentials
|
||||
** System validates username existence
|
||||
** Password hash comparison
|
||||
** Session token generation
|
||||
|
||||
* Session Management
|
||||
** Secure session storage
|
||||
** Token-based authentication
|
||||
** Automatic session expiration
|
||||
** Re-authentication requirements
|
||||
|
||||
!!! Authorization Workflow
|
||||
|
||||
* Request Processing
|
||||
** Capture user action request
|
||||
** Identify target resource
|
||||
** Extract required permissions
|
||||
|
||||
* Permission Validation
|
||||
** Check user roles
|
||||
** Aggregate permissions
|
||||
** Verify ACL entries
|
||||
** Apply guest policies if applicable
|
||||
|
||||
* Access Decision
|
||||
** Compare required vs. available permissions
|
||||
** Apply most restrictive policy
|
||||
** Return access decision
|
||||
|
||||
!!! System Extension Guidelines
|
||||
|
||||
!!!! Adding New Roles
|
||||
|
||||
# Access administrative interface
|
||||
# Define role identifier
|
||||
# Assign base permissions
|
||||
# Configure ACL mappings
|
||||
# Test role functionality
|
||||
|
||||
!!!! Permission Expansion
|
||||
|
||||
# Define new permission type
|
||||
# Update ACL structure
|
||||
# Implement permission checks
|
||||
# Update validation logic
|
||||
# Document new permission
|
||||
|
||||
!!!! Security Considerations
|
||||
|
||||
* Regular permission audits
|
||||
* Role assignment reviews
|
||||
* Guest access monitoring
|
||||
* Security log analysis
|
||||
* Access pattern monitoring
|
||||
|
||||
This comprehensive security model provides flexible, maintainable, and secure access control while supporting both authenticated and guest users within the Multiwiki Server environment.
|
||||
|
||||
! HTTP API
|
||||
|
||||
The ~MultiWikiServer HTTP API provides access to resources hosted by the MWS store. It is based on [[the API of TiddlyWeb|https://tank.peermore.com/tanks/tiddlyweb/HTTP%20API]], first developed in 2008 by Chris Dent.
|
||||
|
||||
The design goals of the API are:
|
||||
|
||||
* To follow the principles of REST where practical
|
||||
* To present resources as nouns, not verbs
|
||||
|
||||
General points about the design:
|
||||
|
||||
* In MWS there are no resources that end with / (except for the root path which is /)
|
||||
@@ -0,0 +1,19 @@
|
||||
title: Troublesheeting gyp/prebuild Installation Errors
|
||||
tags: Troubleshooting
|
||||
modified: 20241105133737778
|
||||
created: 20241105133737778
|
||||
|
||||
Installation may fail with errors related to `gyp` or `prebuild`. These errors are caused by missing dependencies or incorrect versions of dependencies.
|
||||
|
||||
Note that in most cases, these errors occur because of the use of the npm module [[better-sqlite3|https://www.npmjs.com/package/better-sqlite3]]. This module is mostly written in C, and thus requires compilation for the target platform. MWS supports switchable database engines, and also supports the use of the [[node-sqlite3-wasm|https://www.npmjs.com/package/node-sqlite3-wasm]] module which is written in ~JavaScript and does not require compilation and so may avoid these errors. See [[Database Engines]] for more details of how to switch between engines.
|
||||
|
||||
The following steps may help resolve errors involving `gyp` or `prebuild`:
|
||||
|
||||
# Ensure that you have the latest version of Node.js installed. You can download the latest version from the [[Node.js website|https://nodejs.org/]].
|
||||
# Update npm to the latest version by running the following command in your terminal: <<.copy-code-to-clipboard "npm install -g npm@latest">>
|
||||
# Clear the npm cache by running the following command in your terminal: <<.copy-code-to-clipboard "npm cache clean --force">>
|
||||
# Delete the `node_modules` folder in your TiddlyWiki directory by running the following command in your terminal: <<.copy-code-to-clipboard "rm -rf node_modules">>
|
||||
# Reinstall the dependencies by running the following command in your terminal: <<.copy-code-to-clipboard "npm install">>
|
||||
# If you continue to encounter errors, try running the following command in your terminal: <<.copy-code-to-clipboard "npm rebuild">>
|
||||
# If you are still experiencing issues, you may need to manually install the `gyp` and `prebuild` dependencies. You can do this by running the following commands in your terminal: <<.copy-code-to-clipboard "npm install -g node-gyp">> <<.copy-code-to-clipboard "npm install -g prebuild">>
|
||||
# Once you have installed the dependencies, try reinstalling the TiddlyWiki dependencies by running the following command in your terminal: <<.copy-code-to-clipboard "npm install">>
|
||||
4
editions/multiwikidocs/tiddlers/Troubleshooting.tid
Normal file
4
editions/multiwikidocs/tiddlers/Troubleshooting.tid
Normal file
@@ -0,0 +1,4 @@
|
||||
title: Troubleshooting
|
||||
tags: TableOfContents
|
||||
|
||||
<<list-links "[tag[Troubleshooting]]">>
|
||||
13
editions/multiwikidocs/tiddlers/Usage.tid
Normal file
13
editions/multiwikidocs/tiddlers/Usage.tid
Normal file
@@ -0,0 +1,13 @@
|
||||
title: Usage
|
||||
tags: TableOfContents
|
||||
modified: 20241105133737778
|
||||
created: 20241105133737778
|
||||
|
||||
Once MWS is successfully [[installed|Installation]], you can access it by visiting http://localhost:8080 in a browser on the same computer.
|
||||
|
||||
By default, MWS is installed with full anonymous access enabled, meaning that anyone with access to the server has full access to read and modify anything. However, also by default, the server is only accessible to browsers on the same machine.
|
||||
|
||||
If you intend to put an MWS installation on a public network like the Internet, the server will need to be secured with the following steps:
|
||||
|
||||
* Create and login with a new administrator account
|
||||
* Disable anonymouse access
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user