mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2026-01-25 12:23:42 +00:00
Compare commits
353 Commits
publishing
...
direct-sty
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c79106fe5b | ||
|
|
aac910ddf3 | ||
|
|
1d16206188 | ||
|
|
1e30744d88 | ||
|
|
37a6ff8521 | ||
|
|
d3ea98fcef | ||
|
|
dac807f938 | ||
|
|
5022516c61 | ||
|
|
965d8ee014 | ||
|
|
8e50ad1243 | ||
|
|
33f40c47c6 | ||
|
|
1b3c2557b8 | ||
|
|
1a4766c5a1 | ||
|
|
e49dda3b48 | ||
|
|
bd447f0716 | ||
|
|
13faeaa0bd | ||
|
|
7f0fb2b610 | ||
|
|
7d2994388b | ||
|
|
edb5dc3fdc | ||
|
|
df1b1316c8 | ||
|
|
1a0c831216 | ||
|
|
f4365e4bb4 | ||
|
|
75d10a2dc3 | ||
|
|
da7cf7a4f3 | ||
|
|
6452eb56a9 | ||
|
|
9fce8153df | ||
|
|
4cdfa4e3f9 | ||
|
|
d6384df6fc | ||
|
|
f0bd06b38d | ||
|
|
d823856082 | ||
|
|
b02a82ba0f | ||
|
|
c43b013539 | ||
|
|
5548186c93 | ||
|
|
def9b553a8 | ||
|
|
35f7a8ea06 | ||
|
|
c88017b87f | ||
|
|
54bfb28063 | ||
|
|
80c63b96cf | ||
|
|
2ef9ecbc44 | ||
|
|
88812092fd | ||
|
|
4e01fc1838 | ||
|
|
5cab75f4a7 | ||
|
|
1345384d39 | ||
|
|
927013a57a | ||
|
|
0d11fccba2 | ||
|
|
d78ad756db | ||
|
|
373a3f2087 | ||
|
|
cf8b113e35 | ||
|
|
15877eef93 | ||
|
|
5613bcc884 | ||
|
|
0729d730f8 | ||
|
|
f2422efeb8 | ||
|
|
cbb002ec4b | ||
|
|
c7e8c87f85 | ||
|
|
66ae1d6930 | ||
|
|
8e3885277f | ||
|
|
9293dfa477 | ||
|
|
8a80d89582 | ||
|
|
10ebd93df3 | ||
|
|
d414eef773 | ||
|
|
7d1f0ea8f4 | ||
|
|
f477e90192 | ||
|
|
b4dec78a72 | ||
|
|
60187dc59e | ||
|
|
4453aefad8 | ||
|
|
54cfda76ee | ||
|
|
1e8c2821d6 | ||
|
|
cbc030fbe2 | ||
|
|
b454116163 | ||
|
|
0186c6490f | ||
|
|
853a899c77 | ||
|
|
95a3d7fde2 | ||
|
|
d33e0a05e2 | ||
|
|
cb833b3f65 | ||
|
|
b73c50adeb | ||
|
|
fdfa45329a | ||
|
|
7b1880404c | ||
|
|
2739b1bafe | ||
|
|
cc782ff518 | ||
|
|
492bfbebe9 | ||
|
|
c9fbff265a | ||
|
|
b0f72d0690 | ||
|
|
6070a2c921 | ||
|
|
cb43b91ab6 | ||
|
|
804bc9e9c0 | ||
|
|
4514a67a1f | ||
|
|
edcba4ee16 | ||
|
|
9e28356047 | ||
|
|
44ad8c770f | ||
|
|
2dd4fa41a5 | ||
|
|
f5389b3859 | ||
|
|
65c8d74218 | ||
|
|
f88e3939e1 | ||
|
|
769778b05b | ||
|
|
f84ff0d778 | ||
|
|
ca1aabe21f | ||
|
|
dd801d1571 | ||
|
|
485730483b | ||
|
|
8b6733d792 | ||
|
|
75aabcce64 | ||
|
|
5dfa6b2bb4 | ||
|
|
3798a3c7d0 | ||
|
|
1c4b2243a6 | ||
|
|
c11493ec37 | ||
|
|
b6c8cdae64 | ||
|
|
b80d079d71 | ||
|
|
6512b038c5 | ||
|
|
6d1d497a63 | ||
|
|
6ea7140e8f | ||
|
|
7b311b0e4a | ||
|
|
be3018fe3b | ||
|
|
68095eb392 | ||
|
|
4bb34e4801 | ||
|
|
1348607c8f | ||
|
|
2f86779a27 | ||
|
|
2af632a46d | ||
|
|
05606f72ad | ||
|
|
6d0701e0fa | ||
|
|
76cdc17f3b | ||
|
|
7b076eadfa | ||
|
|
c5ce2a0a94 | ||
|
|
7fcc84156e | ||
|
|
75bf12db7a | ||
|
|
07de96459e | ||
|
|
be036aa9c8 | ||
|
|
0664895670 | ||
|
|
dde1e4bc0f | ||
|
|
122de63b71 | ||
|
|
e3ba880e18 | ||
|
|
e3be15531f | ||
|
|
5a3ff4e3dc | ||
|
|
f7f32f00a3 | ||
|
|
d7d694b14f | ||
|
|
a6feb6dd66 | ||
|
|
ecf10e41c3 | ||
|
|
481edc1cfe | ||
|
|
ff5817ab50 | ||
|
|
80235bf049 | ||
|
|
ecddd5a7be | ||
|
|
f22fc788e5 | ||
|
|
f828a582c3 | ||
|
|
a94f94f352 | ||
|
|
9f34a01577 | ||
|
|
9cd49ed485 | ||
|
|
4ea1a05af6 | ||
|
|
b6eb6d477b | ||
|
|
cce18d8e2e | ||
|
|
45d469ca5c | ||
|
|
fbee714ffe | ||
|
|
2429dcc2e2 | ||
|
|
4d84422f22 | ||
|
|
d98bfbde58 | ||
|
|
983787a8f2 | ||
|
|
7b83c22e78 | ||
|
|
c8c43b2811 | ||
|
|
7e32e2efcf | ||
|
|
6f8e842105 | ||
|
|
ce99c0aa0f | ||
|
|
3ff165402c | ||
|
|
a350a76a00 | ||
|
|
05b9dd1822 | ||
|
|
5207b1c127 | ||
|
|
267c351735 | ||
|
|
f545418e55 | ||
|
|
97dd832d2e | ||
|
|
d7e7d87581 | ||
|
|
bd2efeaaa3 | ||
|
|
a206bf56b9 | ||
|
|
a33e94c4ee | ||
|
|
e9313b1c9d | ||
|
|
8096935d87 | ||
|
|
dcb083abb0 | ||
|
|
6cc76fe6ab | ||
|
|
4f8de1881c | ||
|
|
9caba544eb | ||
|
|
746a8ca17f | ||
|
|
2475e1b501 | ||
|
|
193628d63f | ||
|
|
b6ce353a7d | ||
|
|
7a50603d9d | ||
|
|
d21fabca4b | ||
|
|
daa9a8ae45 | ||
|
|
d9eb5499a3 | ||
|
|
870c7897ad | ||
|
|
95da1c2907 | ||
|
|
2bfe522b72 | ||
|
|
c099bf9893 | ||
|
|
ab0dda1177 | ||
|
|
4f65953da9 | ||
|
|
d77de61a06 | ||
|
|
3287cf56bb | ||
|
|
b5c81d2721 | ||
|
|
d3522854b6 | ||
|
|
2f3f9de7be | ||
|
|
6890952357 | ||
|
|
d695fca301 | ||
|
|
a0d2392f01 | ||
|
|
23b4e03cd5 | ||
|
|
d5f72cb282 | ||
|
|
5f57bf81cd | ||
|
|
e32c9e4658 | ||
|
|
2a73505508 | ||
|
|
4d87ef4231 | ||
|
|
71be167592 | ||
|
|
c543036a0f | ||
|
|
989947b99a | ||
|
|
3d86d62a6e | ||
|
|
0cfe6597d4 | ||
|
|
8ae4428332 | ||
|
|
81b4e99ccc | ||
|
|
2f133a08aa | ||
|
|
6b17e688da | ||
|
|
8654066f03 | ||
|
|
56dae90425 | ||
|
|
1f6ef07860 | ||
|
|
f30a455ee3 | ||
|
|
03bd99cd11 | ||
|
|
cc389ec82b | ||
|
|
f85678b6dc | ||
|
|
8d7c869072 | ||
|
|
8f592d3f0a | ||
|
|
1f2e0ed189 | ||
|
|
4d6c428ba9 | ||
|
|
d095aa0182 | ||
|
|
15bf850280 | ||
|
|
62b273266e | ||
|
|
1d058177be | ||
|
|
14676b345a | ||
|
|
a50e6eed38 | ||
|
|
073a064ae8 | ||
|
|
e00a3d3cb4 | ||
|
|
68d9200a6b | ||
|
|
2551bb3e3f | ||
|
|
80b18e6315 | ||
|
|
e0561397f1 | ||
|
|
b9c3c38edc | ||
|
|
077ced0d1a | ||
|
|
e5ff84035c | ||
|
|
e18a983209 | ||
|
|
6f61fa07fb | ||
|
|
d5d73e02e9 | ||
|
|
4ba7454d8d | ||
|
|
5192a39830 | ||
|
|
aa5413b942 | ||
|
|
ef284e9bde | ||
|
|
9c41fe1d18 | ||
|
|
e577cf7302 | ||
|
|
ebf563ac70 | ||
|
|
909340c6fe | ||
|
|
df6d38df65 | ||
|
|
59a53e695b | ||
|
|
6d17505f7b | ||
|
|
36dd8ea1d2 | ||
|
|
b965ae926b | ||
|
|
f6eadbd1c9 | ||
|
|
bdbb884be0 | ||
|
|
0be39cfbc2 | ||
|
|
ef2aeac7de | ||
|
|
157afda2fc | ||
|
|
fb4d77ef46 | ||
|
|
575c233597 | ||
|
|
2e59d770f7 | ||
|
|
baf0ee9cde | ||
|
|
af89bb591d | ||
|
|
d0dec741ad | ||
|
|
33a82e395e | ||
|
|
f223896c26 | ||
|
|
de33b365ae | ||
|
|
e9d8547a81 | ||
|
|
dcff318a98 | ||
|
|
f725123690 | ||
|
|
e9e5d37ff0 | ||
|
|
f70cee6907 | ||
|
|
1491339f50 | ||
|
|
8a5ed59ff4 | ||
|
|
a2ca5e4d1e | ||
|
|
fba993502d | ||
|
|
9fae3a932b | ||
|
|
62610f0666 | ||
|
|
7282ec5286 | ||
|
|
9830e0104f | ||
|
|
e6fd0caf6b | ||
|
|
137df37bc7 | ||
|
|
d895706199 | ||
|
|
6ed7d418b5 | ||
|
|
62b8a83741 | ||
|
|
e795b501ac | ||
|
|
03228d8d20 | ||
|
|
c9c5d4cf79 | ||
|
|
f5cc5bc6a1 | ||
|
|
447494ad4d | ||
|
|
c9f178ec87 | ||
|
|
33be326ef6 | ||
|
|
c13f04d838 | ||
|
|
737685149c | ||
|
|
33eef0202d | ||
|
|
a67b1b8bb5 | ||
|
|
124b49456a | ||
|
|
24956087cc | ||
|
|
199ca57f1c | ||
|
|
64d53ac533 | ||
|
|
b3accbf9e0 | ||
|
|
99249a3160 | ||
|
|
f7cd8bad3a | ||
|
|
e9613d7f12 | ||
|
|
97dff042f7 | ||
|
|
32b36fb2af | ||
|
|
41535150dd | ||
|
|
8e69284e8c | ||
|
|
61cfac4eeb | ||
|
|
2720072b23 | ||
|
|
0413c3a38e | ||
|
|
f2b30c1fe0 | ||
|
|
3c86cf7d2e | ||
|
|
451074f7ed | ||
|
|
1e5601ca31 | ||
|
|
75c99cd235 | ||
|
|
bb2c2be9b6 | ||
|
|
53c247b9a1 | ||
|
|
82667d9d16 | ||
|
|
97ed2757f0 | ||
|
|
19fd5ca5f2 | ||
|
|
6ae78a770f | ||
|
|
04962b4cd6 | ||
|
|
f97850dd05 | ||
|
|
2cb3ed3ab9 | ||
|
|
a4421f50c6 | ||
|
|
cb726f40fa | ||
|
|
be026aa308 | ||
|
|
b95f6ca084 | ||
|
|
4a7f078abd | ||
|
|
54d8b8a373 | ||
|
|
dd6bd58140 | ||
|
|
4c56bd771a | ||
|
|
a70b26cd55 | ||
|
|
c4a7ae3164 | ||
|
|
8b8f654c9c | ||
|
|
9b247f6d63 | ||
|
|
f342fdc41d | ||
|
|
ca96f7f62b | ||
|
|
2f31eab8f4 | ||
|
|
c8528fd1f7 | ||
|
|
07ac85d9fa | ||
|
|
e84f214280 | ||
|
|
9cd65efad9 | ||
|
|
41200ab6d7 | ||
|
|
62fdaa633a | ||
|
|
79f5e6b498 | ||
|
|
23bd7e7817 | ||
|
|
792171c8fc | ||
|
|
051a468c63 | ||
|
|
1b226c7556 | ||
|
|
2bd9cc45fa |
@@ -1,15 +1,8 @@
|
|||||||
# Known minified files
|
# Ignore "third party" code whose style we will not change.
|
||||||
/boot/sjcl.js
|
/boot/sjcl.js
|
||||||
|
/core/modules/utils/base64-utf8/base64-utf8.module.js
|
||||||
/core/modules/utils/base64-utf8/base64-utf8.module.min.js
|
/core/modules/utils/base64-utf8/base64-utf8.module.min.js
|
||||||
/core/modules/utils/diff-match-patch/diff_match_patch.js
|
/core/modules/utils/diff-match-patch/diff_match_patch.js
|
||||||
/plugins/tiddlywiki/async/files/async.min.v1.5.0.js
|
/core/modules/utils/diff-match-patch/diff_match_patch_uncompressed.js
|
||||||
/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/anyword-hint.js
|
/core/modules/utils/dom/csscolorparser.js
|
||||||
/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/css-hint.js
|
/plugins/tiddlywiki/*/files/
|
||||||
/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/html-hint.js
|
|
||||||
/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/javascript-hint.js
|
|
||||||
/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/show-hint.js
|
|
||||||
/plugins/tiddlywiki/codemirror-autocomplete/files/addon/hint/xml-hint.js
|
|
||||||
/plugins/tiddlywiki/codemirror-closebrackets/files/addon/edit/closebrackets.js
|
|
||||||
/plugins/tiddlywiki/codemirror-closebrackets/files/addon/edit/matchbrackets.js
|
|
||||||
/plugins/tiddlywiki/codemirror-closetag/files/addon/edit/closetag.js
|
|
||||||
/plugins/tiddlywiki/codemirror-closetag/files/addon/fold/xml-fold.js
|
|
||||||
|
|||||||
@@ -64,7 +64,23 @@ rules:
|
|||||||
init-declarations: 'off'
|
init-declarations: 'off'
|
||||||
jsx-quotes: error
|
jsx-quotes: error
|
||||||
key-spacing: 'off'
|
key-spacing: 'off'
|
||||||
keyword-spacing: 'off'
|
keyword-spacing:
|
||||||
|
- error
|
||||||
|
- before: true
|
||||||
|
after: false
|
||||||
|
overrides:
|
||||||
|
'case':
|
||||||
|
after: true
|
||||||
|
'do':
|
||||||
|
'after': true
|
||||||
|
'else':
|
||||||
|
after: true
|
||||||
|
'return':
|
||||||
|
after: true
|
||||||
|
'throw':
|
||||||
|
after: true
|
||||||
|
'try':
|
||||||
|
after: true
|
||||||
line-comment-position: 'off'
|
line-comment-position: 'off'
|
||||||
linebreak-style: 'off'
|
linebreak-style: 'off'
|
||||||
lines-around-comment: 'off'
|
lines-around-comment: 'off'
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
# Default to the current version number for building the plugin library
|
# Default to the current version number for building the plugin library
|
||||||
|
|
||||||
if [ -z "$TW5_BUILD_VERSION" ]; then
|
if [ -z "$TW5_BUILD_VERSION" ]; then
|
||||||
TW5_BUILD_VERSION=v5.2.0
|
TW5_BUILD_VERSION=v5.2.2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Using TW5_BUILD_VERSION as [$TW5_BUILD_VERSION]"
|
echo "Using TW5_BUILD_VERSION as [$TW5_BUILD_VERSION]"
|
||||||
|
|||||||
67
boot/boot.js
67
boot/boot.js
@@ -256,6 +256,28 @@ $tw.utils.deepDefaults = function(object /*, sourceObjectList */) {
|
|||||||
return object;
|
return object;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Convert a URIComponent encoded string to a string safely
|
||||||
|
*/
|
||||||
|
$tw.utils.decodeURIComponentSafe = function(s) {
|
||||||
|
var v = s;
|
||||||
|
try {
|
||||||
|
v = decodeURIComponent(s);
|
||||||
|
} catch(e) {}
|
||||||
|
return v;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Convert a URI encoded string to a string safely
|
||||||
|
*/
|
||||||
|
$tw.utils.decodeURISafe = function(s) {
|
||||||
|
var v = s;
|
||||||
|
try {
|
||||||
|
v = decodeURI(s);
|
||||||
|
} catch(e) {}
|
||||||
|
return v;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Convert "&" to &, " " to nbsp, "<" to <, ">" to > and """ to "
|
Convert "&" to &, " " to nbsp, "<" to <, ">" to > and """ to "
|
||||||
*/
|
*/
|
||||||
@@ -1212,8 +1234,12 @@ $tw.Wiki = function(options) {
|
|||||||
index,titlesLength,title;
|
index,titlesLength,title;
|
||||||
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
|
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
|
||||||
title = titles[index];
|
title = titles[index];
|
||||||
var shadowInfo = shadowTiddlers[title];
|
if(tiddlers[title]) {
|
||||||
callback(shadowInfo.tiddler,title);
|
callback(tiddlers[title],title);
|
||||||
|
} else {
|
||||||
|
var shadowInfo = shadowTiddlers[title];
|
||||||
|
callback(shadowInfo.tiddler,title);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1602,8 +1628,8 @@ $tw.modules.define("$:/boot/tiddlerdeserializer/json","tiddlerdeserializer",{
|
|||||||
}
|
}
|
||||||
for(var f in data) {
|
for(var f in data) {
|
||||||
if($tw.utils.hop(data,f)) {
|
if($tw.utils.hop(data,f)) {
|
||||||
// Check field name doesn't contain whitespace or control characters
|
// Check field name doesn't contain control characters
|
||||||
if(typeof(data[f]) !== "string" || /[\x00-\x1F\s]/.test(f)) {
|
if(typeof(data[f]) !== "string" || /[\x00-\x1F]/.test(f)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1618,7 +1644,12 @@ $tw.modules.define("$:/boot/tiddlerdeserializer/json","tiddlerdeserializer",{
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
data = JSON.parse(text);
|
data = {};
|
||||||
|
try {
|
||||||
|
data = JSON.parse(text);
|
||||||
|
} catch(e) {
|
||||||
|
// Ignore JSON parse errors
|
||||||
|
}
|
||||||
if($tw.utils.isArray(data) && isTiddlerArrayValid(data)) {
|
if($tw.utils.isArray(data) && isTiddlerArrayValid(data)) {
|
||||||
return data;
|
return data;
|
||||||
} else if(isTiddlerValid(data)) {
|
} else if(isTiddlerValid(data)) {
|
||||||
@@ -1885,13 +1916,13 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
|
|||||||
value = path.basename(filename);
|
value = path.basename(filename);
|
||||||
break;
|
break;
|
||||||
case "filename-uri-decoded":
|
case "filename-uri-decoded":
|
||||||
value = decodeURIComponent(path.basename(filename));
|
value = $tw.utils.decodeURIComponentSafe(path.basename(filename));
|
||||||
break;
|
break;
|
||||||
case "basename":
|
case "basename":
|
||||||
value = path.basename(filename,path.extname(filename));
|
value = path.basename(filename,path.extname(filename));
|
||||||
break;
|
break;
|
||||||
case "basename-uri-decoded":
|
case "basename-uri-decoded":
|
||||||
value = decodeURIComponent(path.basename(filename,path.extname(filename)));
|
value = $tw.utils.decodeURIComponentSafe(path.basename(filename,path.extname(filename)));
|
||||||
break;
|
break;
|
||||||
case "extname":
|
case "extname":
|
||||||
value = path.extname(filename);
|
value = path.extname(filename);
|
||||||
@@ -1919,6 +1950,20 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
|
|||||||
tiddlers.push({tiddlers: fileTiddlers});
|
tiddlers.push({tiddlers: fileTiddlers});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
// Helper to recursively search subdirectories
|
||||||
|
var getAllFiles = function(dirPath, recurse, arrayOfFiles) {
|
||||||
|
recurse = recurse || false;
|
||||||
|
arrayOfFiles = arrayOfFiles || [];
|
||||||
|
var files = fs.readdirSync(dirPath);
|
||||||
|
files.forEach(function(file) {
|
||||||
|
if (recurse && fs.statSync(dirPath + path.sep + file).isDirectory()) {
|
||||||
|
arrayOfFiles = getAllFiles(dirPath + path.sep + file, recurse, arrayOfFiles);
|
||||||
|
} else if(fs.statSync(dirPath + path.sep + file).isFile()){
|
||||||
|
arrayOfFiles.push(path.join(dirPath, path.sep, file));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return arrayOfFiles;
|
||||||
|
}
|
||||||
// Process the listed tiddlers
|
// Process the listed tiddlers
|
||||||
$tw.utils.each(filesInfo.tiddlers,function(tidInfo) {
|
$tw.utils.each(filesInfo.tiddlers,function(tidInfo) {
|
||||||
if(tidInfo.prefix && tidInfo.suffix) {
|
if(tidInfo.prefix && tidInfo.suffix) {
|
||||||
@@ -1942,13 +1987,14 @@ $tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
|
|||||||
// Process directory specifier
|
// Process directory specifier
|
||||||
var dirPath = path.resolve(filepath,dirSpec.path);
|
var dirPath = path.resolve(filepath,dirSpec.path);
|
||||||
if(fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory()) {
|
if(fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory()) {
|
||||||
var files = fs.readdirSync(dirPath),
|
var files = getAllFiles(dirPath, dirSpec.searchSubdirectories),
|
||||||
fileRegExp = new RegExp(dirSpec.filesRegExp || "^.*$"),
|
fileRegExp = new RegExp(dirSpec.filesRegExp || "^.*$"),
|
||||||
metaRegExp = /^.*\.meta$/;
|
metaRegExp = /^.*\.meta$/;
|
||||||
for(var t=0; t<files.length; t++) {
|
for(var t=0; t<files.length; t++) {
|
||||||
var filename = files[t];
|
var thisPath = path.relative(filepath, files[t]),
|
||||||
|
filename = path.basename(thisPath);
|
||||||
if(filename !== "tiddlywiki.files" && !metaRegExp.test(filename) && fileRegExp.test(filename)) {
|
if(filename !== "tiddlywiki.files" && !metaRegExp.test(filename) && fileRegExp.test(filename)) {
|
||||||
processFile(dirPath + path.sep + filename,dirSpec.isTiddlerFile,dirSpec.fields,dirSpec.isEditableFile);
|
processFile(thisPath,dirSpec.isTiddlerFile,dirSpec.fields,dirSpec.isEditableFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -2603,3 +2649,4 @@ if(typeof(exports) !== "undefined") {
|
|||||||
} else {
|
} else {
|
||||||
_boot(window.$tw);
|
_boot(window.$tw);
|
||||||
}
|
}
|
||||||
|
//# sourceURL=$:/boot/boot.js
|
||||||
|
|||||||
@@ -117,3 +117,4 @@ if(typeof(exports) === "undefined") {
|
|||||||
// Export functionality as a module
|
// Export functionality as a module
|
||||||
exports.bootprefix = _bootprefix;
|
exports.bootprefix = _bootprefix;
|
||||||
}
|
}
|
||||||
|
//# sourceURL=$:/boot/bootprefix.js
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -4,7 +4,7 @@ type: text/plain
|
|||||||
TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)
|
TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)
|
||||||
|
|
||||||
Copyright (c) 2004-2007, Jeremy Ruston
|
Copyright (c) 2004-2007, Jeremy Ruston
|
||||||
Copyright (c) 2007-2021, UnaMesa Association
|
Copyright (c) 2007-2022, UnaMesa Association
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ ExportTiddler/Caption: export tiddler
|
|||||||
ExportTiddler/Hint: Export tiddler
|
ExportTiddler/Hint: Export tiddler
|
||||||
ExportTiddlers/Caption: export tiddlers
|
ExportTiddlers/Caption: export tiddlers
|
||||||
ExportTiddlers/Hint: Export tiddlers
|
ExportTiddlers/Hint: Export tiddlers
|
||||||
ExportTiddlyWikiCore/Caption: export TiddlyWiki core
|
|
||||||
ExportTiddlyWikiCore/Hint: Export the ~TiddlyWiki core code for running with external ~JavaScript
|
|
||||||
SidebarSearch/Hint: Select the sidebar search field
|
SidebarSearch/Hint: Select the sidebar search field
|
||||||
Fold/Caption: fold tiddler
|
Fold/Caption: fold tiddler
|
||||||
Fold/Hint: Fold the body of this tiddler
|
Fold/Hint: Fold the body of this tiddler
|
||||||
|
|||||||
@@ -27,10 +27,15 @@ Basics/Tiddlers/Prompt: Number of tiddlers
|
|||||||
Basics/Title/Prompt: Title of this ~TiddlyWiki
|
Basics/Title/Prompt: Title of this ~TiddlyWiki
|
||||||
Basics/Username/Prompt: Username for signing edits
|
Basics/Username/Prompt: Username for signing edits
|
||||||
Basics/Version/Prompt: ~TiddlyWiki version
|
Basics/Version/Prompt: ~TiddlyWiki version
|
||||||
|
Cascades/Caption: Cascades
|
||||||
|
Cascades/Hint: These global rules are used to dynamically choose certain templates. The result of the cascade is the result of the first filter in the sequence that returns a result
|
||||||
|
Cascades/TagPrompt: Filters tagged <$macrocall $name="tag" tag=<<currentTiddler>>/>
|
||||||
EditorTypes/Caption: Editor Types
|
EditorTypes/Caption: Editor Types
|
||||||
EditorTypes/Editor/Caption: Editor
|
EditorTypes/Editor/Caption: Editor
|
||||||
EditorTypes/Hint: These tiddlers determine which editor is used to edit specific tiddler types.
|
EditorTypes/Hint: These tiddlers determine which editor is used to edit specific tiddler types.
|
||||||
EditorTypes/Type/Caption: Type
|
EditorTypes/Type/Caption: Type
|
||||||
|
EditTemplateBody/Caption: Edit Template Body
|
||||||
|
EditTemplateBody/Hint: This rule cascade is used by the default edit template to dynamically choose the template for editing the body of a tiddler.
|
||||||
Info/Caption: Info
|
Info/Caption: Info
|
||||||
Info/Hint: Information about this TiddlyWiki
|
Info/Hint: Information about this TiddlyWiki
|
||||||
KeyboardShortcuts/Add/Prompt: Type shortcut here
|
KeyboardShortcuts/Add/Prompt: Type shortcut here
|
||||||
@@ -191,6 +196,8 @@ Settings/TitleLinks/Yes/Description: Display tiddler titles as links
|
|||||||
Settings/MissingLinks/Caption: Wiki Links
|
Settings/MissingLinks/Caption: Wiki Links
|
||||||
Settings/MissingLinks/Hint: Choose whether to link to tiddlers that do not exist yet
|
Settings/MissingLinks/Hint: Choose whether to link to tiddlers that do not exist yet
|
||||||
Settings/MissingLinks/Description: Enable links to missing tiddlers
|
Settings/MissingLinks/Description: Enable links to missing tiddlers
|
||||||
|
StoryTiddler/Caption: Story Tiddler
|
||||||
|
StoryTiddler/Hint: This rule cascade is used to dynamically choose the template for displaying a tiddler in the story river.
|
||||||
StoryView/Caption: Story View
|
StoryView/Caption: Story View
|
||||||
StoryView/Prompt: Current view:
|
StoryView/Prompt: Current view:
|
||||||
Stylesheets/Caption: Stylesheets
|
Stylesheets/Caption: Stylesheets
|
||||||
@@ -201,6 +208,10 @@ Theme/Caption: Theme
|
|||||||
Theme/Prompt: Current theme:
|
Theme/Prompt: Current theme:
|
||||||
TiddlerFields/Caption: Tiddler Fields
|
TiddlerFields/Caption: Tiddler Fields
|
||||||
TiddlerFields/Hint: This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers).
|
TiddlerFields/Hint: This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers).
|
||||||
|
TiddlerColour/Caption: Tiddler Colour
|
||||||
|
TiddlerColour/Hint: This rules cascade is used to dynamically choose the colour for a tiddler (used for the icon and the associated tag pill).
|
||||||
|
TiddlerIcon/Caption: Tiddler Icon
|
||||||
|
TiddlerIcon/Hint: This rules cascade is used to dynamically choose the icon for a tiddler.
|
||||||
Toolbars/Caption: Toolbars
|
Toolbars/Caption: Toolbars
|
||||||
Toolbars/EditToolbar/Caption: Edit Toolbar
|
Toolbars/EditToolbar/Caption: Edit Toolbar
|
||||||
Toolbars/EditToolbar/Hint: Choose which buttons are displayed for tiddlers in edit mode. Drag and drop to change the ordering
|
Toolbars/EditToolbar/Hint: Choose which buttons are displayed for tiddlers in edit mode. Drag and drop to change the ordering
|
||||||
@@ -212,3 +223,7 @@ Toolbars/EditorToolbar/Hint: Choose which buttons are displayed in the editor to
|
|||||||
Toolbars/ViewToolbar/Caption: View Toolbar
|
Toolbars/ViewToolbar/Caption: View Toolbar
|
||||||
Toolbars/ViewToolbar/Hint: Choose which buttons are displayed for tiddlers in view mode. Drag and drop to change the ordering
|
Toolbars/ViewToolbar/Hint: Choose which buttons are displayed for tiddlers in view mode. Drag and drop to change the ordering
|
||||||
Tools/Download/Full/Caption: Download full wiki
|
Tools/Download/Full/Caption: Download full wiki
|
||||||
|
ViewTemplateBody/Caption: View Template Body
|
||||||
|
ViewTemplateBody/Hint: This rule cascade is used by the default view template to dynamically choose the template for displaying the body of a tiddler.
|
||||||
|
ViewTemplateTitle/Caption: View Template Title
|
||||||
|
ViewTemplateTitle/Hint: This rule cascade is used by the default view template to dynamically choose the template for displaying the title of a tiddler.
|
||||||
@@ -3,6 +3,7 @@ title: $:/language/Docs/Fields/
|
|||||||
_canonical_uri: The full URI of an external image tiddler
|
_canonical_uri: The full URI of an external image tiddler
|
||||||
bag: The name of the bag from which a tiddler came
|
bag: The name of the bag from which a tiddler came
|
||||||
caption: The text to be displayed on a tab or button
|
caption: The text to be displayed on a tab or button
|
||||||
|
code-body: The view template will display the tiddler as code if set to ''yes''
|
||||||
color: The CSS color value associated with a tiddler
|
color: The CSS color value associated with a tiddler
|
||||||
component: The name of the component responsible for an [[alert tiddler|AlertMechanism]]
|
component: The name of the component responsible for an [[alert tiddler|AlertMechanism]]
|
||||||
current-tiddler: Used to cache the top tiddler in a [[history list|HistoryMechanism]]
|
current-tiddler: Used to cache the top tiddler in a [[history list|HistoryMechanism]]
|
||||||
@@ -13,9 +14,9 @@ description: The descriptive text for a plugin, or a modal dialogue
|
|||||||
draft.of: For draft tiddlers, contains the title of the tiddler of which this is a draft
|
draft.of: For draft tiddlers, contains the title of the tiddler of which this is a draft
|
||||||
draft.title: For draft tiddlers, contains the proposed new title of the tiddler
|
draft.title: For draft tiddlers, contains the proposed new title of the tiddler
|
||||||
footer: The footer text for a wizard
|
footer: The footer text for a wizard
|
||||||
hide-body: The view template will hide bodies of tiddlers if set to: ''yes''
|
hide-body: The view template will hide bodies of tiddlers if set to ''yes''
|
||||||
icon: The title of the tiddler containing the icon associated with a tiddler
|
icon: The title of the tiddler containing the icon associated with a tiddler
|
||||||
library: Indicates that a tiddler should be saved as a JavaScript library if set to: ''yes''
|
library: Indicates that a tiddler should be saved as a JavaScript library if set to ''yes''
|
||||||
list: An ordered list of tiddler titles associated with a tiddler
|
list: An ordered list of tiddler titles associated with a tiddler
|
||||||
list-before: If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty
|
list-before: If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty
|
||||||
list-after: If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles, or at the end of the list if this field is present but empty
|
list-after: If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles, or at the end of the list if this field is present but empty
|
||||||
@@ -32,7 +33,7 @@ tags: A list of tags associated with a tiddler
|
|||||||
text: The body text of a tiddler
|
text: The body text of a tiddler
|
||||||
throttle.refresh: If present, throttles refreshes of this tiddler
|
throttle.refresh: If present, throttles refreshes of this tiddler
|
||||||
title: The unique name of a tiddler
|
title: The unique name of a tiddler
|
||||||
toc-link: Suppresses the tiddler's link in a Table of Contents tree if set to: ''no''
|
toc-link: Suppresses the tiddler's link in a Table of Contents tree if set to ''no''
|
||||||
type: The content type of a tiddler
|
type: The content type of a tiddler
|
||||||
version: Version information for a plugin
|
version: Version information for a plugin
|
||||||
_is_skinny: If present, indicates that the tiddler text field must be loaded from the server
|
_is_skinny: If present, indicates that the tiddler text field must be loaded from the server
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ All parameters are optional with safe defaults, and can be specified in any orde
|
|||||||
* ''readers'' - comma-separated list of principals allowed to read from this wiki
|
* ''readers'' - comma-separated list of principals allowed to read from this wiki
|
||||||
* ''writers'' - comma-separated list of principals allowed to write to this wiki
|
* ''writers'' - comma-separated list of principals allowed to write to this wiki
|
||||||
* ''csrf-disable'' - set to "yes" to disable CSRF checks (defaults to "no")
|
* ''csrf-disable'' - set to "yes" to disable CSRF checks (defaults to "no")
|
||||||
* ''sse-enabled'' - set to "yes" to enable Server-sent events (defaults to "no")
|
|
||||||
* ''root-tiddler'' - the tiddler to serve at the root (defaults to "$:/core/save/all")
|
* ''root-tiddler'' - the tiddler to serve at the root (defaults to "$:/core/save/all")
|
||||||
* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to "text/plain")
|
* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to "text/plain")
|
||||||
* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to "text/html")
|
* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to "text/html")
|
||||||
|
|||||||
@@ -30,5 +30,5 @@ Upgrader/System/Warning: Core module tiddler.
|
|||||||
Upgrader/System/Alert: You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable.
|
Upgrader/System/Alert: You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable.
|
||||||
Upgrader/ThemeTweaks/Created: Migrated theme tweak from <$text text=<<from>>/>.
|
Upgrader/ThemeTweaks/Created: Migrated theme tweak from <$text text=<<from>>/>.
|
||||||
Upgrader/Tiddler/Disabled: Disabled tiddler.
|
Upgrader/Tiddler/Disabled: Disabled tiddler.
|
||||||
Upgrader/Tiddler/Selected: User selected.
|
Upgrader/Tiddler/Selected: Selected tiddler.
|
||||||
Upgrader/Tiddler/Unselected: Unselected tiddler.
|
Upgrader/Tiddler/Unselected: Unselected tiddler.
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ ConfirmAction: Do you wish to proceed?
|
|||||||
Count: count
|
Count: count
|
||||||
DefaultNewTiddlerTitle: New Tiddler
|
DefaultNewTiddlerTitle: New Tiddler
|
||||||
Diffs/CountMessage: <<diff-count>> differences
|
Diffs/CountMessage: <<diff-count>> differences
|
||||||
DropMessage: Drop here (or use the 'Escape' key to cancel)
|
DropMessage: Drop now (or use the 'Escape' key to cancel)
|
||||||
Encryption/Cancel: Cancel
|
Encryption/Cancel: Cancel
|
||||||
Encryption/ConfirmClearPassword: Do you wish to clear the password? This will remove the encryption applied when saving this wiki
|
Encryption/ConfirmClearPassword: Do you wish to clear the password? This will remove the encryption applied when saving this wiki
|
||||||
Encryption/PromptSetPassword: Set a new password for this TiddlyWiki
|
Encryption/PromptSetPassword: Set a new password for this TiddlyWiki
|
||||||
|
|||||||
@@ -8,58 +8,59 @@ Render individual tiddlers and save the results to the specified files
|
|||||||
\*/
|
\*/
|
||||||
(function(){
|
(function(){
|
||||||
|
|
||||||
/*jslint node: true, browser: true */
|
/*jslint node: true, browser: true */
|
||||||
/*global $tw: false */
|
/*global $tw: false */
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var widget = require("$:/core/modules/widgets/widget.js");
|
var widget = require("$:/core/modules/widgets/widget.js");
|
||||||
|
|
||||||
exports.info = {
|
exports.info = {
|
||||||
name: "render",
|
name: "render",
|
||||||
synchronous: true
|
synchronous: true
|
||||||
};
|
};
|
||||||
|
|
||||||
var Command = function(params,commander,callback) {
|
var Command = function(params,commander,callback) {
|
||||||
this.params = params;
|
this.params = params;
|
||||||
this.commander = commander;
|
this.commander = commander;
|
||||||
this.callback = callback;
|
this.callback = callback;
|
||||||
};
|
};
|
||||||
|
|
||||||
Command.prototype.execute = function() {
|
Command.prototype.execute = function() {
|
||||||
if(this.params.length < 1) {
|
if(this.params.length < 1) {
|
||||||
return "Missing tiddler filter";
|
return "Missing tiddler filter";
|
||||||
}
|
|
||||||
var self = this,
|
|
||||||
fs = require("fs"),
|
|
||||||
path = require("path"),
|
|
||||||
wiki = this.commander.wiki,
|
|
||||||
tiddlerFilter = this.params[0],
|
|
||||||
filenameFilter = this.params[1] || "[is[tiddler]addsuffix[.html]]",
|
|
||||||
type = this.params[2] || "text/html",
|
|
||||||
template = this.params[3],
|
|
||||||
variableList = this.params.slice(4),
|
|
||||||
tiddlers = wiki.filterTiddlers(tiddlerFilter),
|
|
||||||
variables = Object.create(null);
|
|
||||||
while(variableList.length >= 2) {
|
|
||||||
variables[variableList[0]] = variableList[1];
|
|
||||||
variableList = variableList.slice(2);
|
|
||||||
}
|
}
|
||||||
$tw.utils.each(tiddlers,function(title) {
|
var self = this,
|
||||||
var parser = wiki.parseTiddler(template || title);
|
fs = require("fs"),
|
||||||
var widgetNode = wiki.makeWidget(parser,{variables: $tw.utils.extend({},variables,{currentTiddler: title})}),
|
path = require("path"),
|
||||||
container = $tw.fakeDocument.createElement("div");
|
wiki = this.commander.wiki,
|
||||||
widgetNode.render(container,null);
|
tiddlerFilter = this.params[0],
|
||||||
var text = type === "text/html" ? container.innerHTML : container.textContent,
|
filenameFilter = this.params[1] || "[is[tiddler]addsuffix[.html]]",
|
||||||
filepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);
|
type = this.params[2] || "text/html",
|
||||||
if(self.commander.verbose) {
|
template = this.params[3],
|
||||||
console.log("Rendering \"" + title + "\" to \"" + filepath + "\"");
|
variableList = this.params.slice(4),
|
||||||
}
|
tiddlers = wiki.filterTiddlers(tiddlerFilter),
|
||||||
$tw.utils.createFileDirectories(filepath);
|
variables = Object.create(null);
|
||||||
fs.writeFileSync(filepath,text,"utf8");
|
while(variableList.length >= 2) {
|
||||||
});
|
variables[variableList[0]] = variableList[1];
|
||||||
return null;
|
variableList = variableList.slice(2);
|
||||||
};
|
}
|
||||||
|
$tw.utils.each(tiddlers,function(title) {
|
||||||
exports.Command = Command;
|
var filepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);
|
||||||
|
if(self.commander.verbose) {
|
||||||
})();
|
console.log("Rendering \"" + title + "\" to \"" + filepath + "\"");
|
||||||
|
}
|
||||||
|
var parser = wiki.parseTiddler(template || title),
|
||||||
|
widgetNode = wiki.makeWidget(parser,{variables: $tw.utils.extend({},variables,{currentTiddler: title})}),
|
||||||
|
container = $tw.fakeDocument.createElement("div");
|
||||||
|
widgetNode.render(container,null);
|
||||||
|
var text = type === "text/html" ? container.innerHTML : container.textContent;
|
||||||
|
$tw.utils.createFileDirectories(filepath);
|
||||||
|
fs.writeFileSync(filepath,text,"utf8");
|
||||||
|
});
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.Command = Command;
|
||||||
|
|
||||||
|
})();
|
||||||
|
|
||||||
@@ -135,7 +135,11 @@ FramedEngine.prototype.setText = function(text,type) {
|
|||||||
Update the DomNode with the new text
|
Update the DomNode with the new text
|
||||||
*/
|
*/
|
||||||
FramedEngine.prototype.updateDomNodeText = function(text) {
|
FramedEngine.prototype.updateDomNodeText = function(text) {
|
||||||
this.domNode.value = text;
|
try {
|
||||||
|
this.domNode.value = text;
|
||||||
|
} catch(e) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -201,7 +205,7 @@ FramedEngine.prototype.handleInputEvent = function(event) {
|
|||||||
this.widget.saveChanges(this.getText());
|
this.widget.saveChanges(this.getText());
|
||||||
this.fixHeight();
|
this.fixHeight();
|
||||||
if(this.widget.editInputActions) {
|
if(this.widget.editInputActions) {
|
||||||
this.widget.invokeActionString(this.widget.editInputActions);
|
this.widget.invokeActionString(this.widget.editInputActions,this,event,{actionValue: this.getText()});
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -85,7 +85,11 @@ SimpleEngine.prototype.setText = function(text,type) {
|
|||||||
Update the DomNode with the new text
|
Update the DomNode with the new text
|
||||||
*/
|
*/
|
||||||
SimpleEngine.prototype.updateDomNodeText = function(text) {
|
SimpleEngine.prototype.updateDomNodeText = function(text) {
|
||||||
this.domNode.value = text;
|
try {
|
||||||
|
this.domNode.value = text;
|
||||||
|
} catch(e) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -129,7 +133,7 @@ SimpleEngine.prototype.handleInputEvent = function(event) {
|
|||||||
this.widget.saveChanges(this.getText());
|
this.widget.saveChanges(this.getText());
|
||||||
this.fixHeight();
|
this.fixHeight();
|
||||||
if(this.widget.editInputActions) {
|
if(this.widget.editInputActions) {
|
||||||
this.widget.invokeActionString(this.widget.editInputActions);
|
this.widget.invokeActionString(this.widget.editInputActions,this,event,{actionValue: this.getText()});
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -324,7 +324,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
|
|||||||
If there are no Files, let the browser handle it.
|
If there are no Files, let the browser handle it.
|
||||||
*/
|
*/
|
||||||
EditTextWidget.prototype.handleDropEvent = function(event) {
|
EditTextWidget.prototype.handleDropEvent = function(event) {
|
||||||
if(event.dataTransfer.files.length) {
|
if($tw.utils.dragEventContainsFiles(event)) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
this.dispatchDOMEvent(this.cloneEvent(event,["dataTransfer"]));
|
this.dispatchDOMEvent(this.cloneEvent(event,["dataTransfer"]));
|
||||||
@@ -332,7 +332,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
EditTextWidget.prototype.handlePasteEvent = function(event) {
|
EditTextWidget.prototype.handlePasteEvent = function(event) {
|
||||||
if(event.clipboardData.files.length) {
|
if(event.clipboardData && event.clipboardData.files && event.clipboardData.files.length) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
this.dispatchDOMEvent(this.cloneEvent(event,["clipboardData"]));
|
this.dispatchDOMEvent(this.cloneEvent(event,["clipboardData"]));
|
||||||
|
|||||||
17
core/modules/editor/operations/text/focus-editor.js
Normal file
17
core/modules/editor/operations/text/focus-editor.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/core/modules/editor/operations/text/focus-editor.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: texteditoroperation
|
||||||
|
Simply focus the Text editor
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports["focus-editor"] = function(event,operation) {
|
||||||
|
operation = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
})();
|
||||||
@@ -13,15 +13,17 @@ Text editor operation to wrap the selected lines with a prefix and suffix
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
exports["wrap-lines"] = function(event,operation) {
|
exports["wrap-lines"] = function(event,operation) {
|
||||||
|
var prefix = event.paramObject.prefix || "",
|
||||||
|
suffix = event.paramObject.suffix || "";
|
||||||
// Cut just past the preceding line break, or the start of the text
|
// Cut just past the preceding line break, or the start of the text
|
||||||
operation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);
|
operation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);
|
||||||
// Cut to just past the following line break, or to the end of the text
|
// Cut to just past the following line break, or to the end of the text
|
||||||
operation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);
|
operation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);
|
||||||
// Add the prefix and suffix
|
// Add the prefix and suffix
|
||||||
operation.replacement = event.paramObject.prefix + "\n" +
|
operation.replacement = prefix + "\n" +
|
||||||
operation.text.substring(operation.cutStart,operation.cutEnd) + "\n" +
|
operation.text.substring(operation.cutStart,operation.cutEnd) + "\n" +
|
||||||
event.paramObject.suffix + "\n";
|
suffix + "\n";
|
||||||
operation.newSelStart = operation.cutStart + event.paramObject.prefix.length + 1;
|
operation.newSelStart = operation.cutStart + prefix.length + 1;
|
||||||
operation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);
|
operation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
53
core/modules/filterrunprefixes/cascade.js
Normal file
53
core/modules/filterrunprefixes/cascade.js
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/core/modules/filterrunprefixes/cascade.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: filterrunprefix
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
/*
|
||||||
|
Export our filter prefix function
|
||||||
|
*/
|
||||||
|
exports.cascade = function(operationSubFunction,options) {
|
||||||
|
return function(results,source,widget) {
|
||||||
|
if(results.length !== 0) {
|
||||||
|
var filterList = operationSubFunction(source,widget),
|
||||||
|
filterFnList = [];
|
||||||
|
var inputResults = results.toArray();
|
||||||
|
results.clear();
|
||||||
|
$tw.utils.each(inputResults,function(title) {
|
||||||
|
var result = ""; // If no filter matches, we return an empty string
|
||||||
|
$tw.utils.each(filterList,function(filter,index) {
|
||||||
|
if(!filterFnList[index]) {
|
||||||
|
filterFnList[index] = options.wiki.compileFilter(filter);
|
||||||
|
}
|
||||||
|
var output = filterFnList[index](options.wiki.makeTiddlerIterator([title]),{
|
||||||
|
getVariable: function(name,opts) {
|
||||||
|
opts = opts || {};
|
||||||
|
opts.variables = {
|
||||||
|
"currentTiddler": "" + title,
|
||||||
|
"..currentTiddler": widget.getVariable("currentTiddler")
|
||||||
|
};
|
||||||
|
if(name in opts.variables) {
|
||||||
|
return opts.variables[name];
|
||||||
|
} else {
|
||||||
|
return widget.getVariable(name,opts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if(output.length !== 0) {
|
||||||
|
result = output[0];
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
results.push(result);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
})();
|
||||||
@@ -16,23 +16,30 @@ Export our filter function
|
|||||||
exports.filter = function(operationSubFunction,options) {
|
exports.filter = function(operationSubFunction,options) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
if(results.length > 0) {
|
if(results.length > 0) {
|
||||||
var resultsToRemove = [];
|
var resultsToRemove = [],
|
||||||
|
index = 0;
|
||||||
results.each(function(title) {
|
results.each(function(title) {
|
||||||
var filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{
|
var filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{
|
||||||
getVariable: function(name) {
|
getVariable: function(name,opts) {
|
||||||
switch(name) {
|
opts = opts || {};
|
||||||
case "currentTiddler":
|
opts.variables = {
|
||||||
return "" + title;
|
"currentTiddler": "" + title,
|
||||||
case "..currentTiddler":
|
"..currentTiddler": widget.getVariable("currentTiddler"),
|
||||||
return widget.getVariable("currentTiddler");
|
"index": "" + index,
|
||||||
default:
|
"revIndex": "" + (results.length - 1 - index),
|
||||||
return widget.getVariable(name);
|
"length": "" + results.length
|
||||||
|
};
|
||||||
|
if(name in opts.variables) {
|
||||||
|
return opts.variables[name];
|
||||||
|
} else {
|
||||||
|
return widget.getVariable(name,opts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if(filtered.length === 0) {
|
if(filtered.length === 0) {
|
||||||
resultsToRemove.push(title);
|
resultsToRemove.push(title);
|
||||||
}
|
}
|
||||||
|
++index;
|
||||||
});
|
});
|
||||||
results.remove(resultsToRemove);
|
results.remove(resultsToRemove);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,22 +15,29 @@ Export our filter prefix function
|
|||||||
exports.map = function(operationSubFunction,options) {
|
exports.map = function(operationSubFunction,options) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
if(results.length > 0) {
|
if(results.length > 0) {
|
||||||
var inputTitles = results.toArray();
|
var inputTitles = results.toArray(),
|
||||||
|
index = 0;
|
||||||
results.clear();
|
results.clear();
|
||||||
$tw.utils.each(inputTitles,function(title) {
|
$tw.utils.each(inputTitles,function(title) {
|
||||||
var filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{
|
var filtered = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{
|
||||||
getVariable: function(name) {
|
getVariable: function(name,opts) {
|
||||||
switch(name) {
|
opts = opts || {};
|
||||||
case "currentTiddler":
|
opts.variables = {
|
||||||
return "" + title;
|
"currentTiddler": "" + title,
|
||||||
case "..currentTiddler":
|
"..currentTiddler": widget.getVariable("currentTiddler"),
|
||||||
return widget.getVariable("currentTiddler");
|
"index": "" + index,
|
||||||
default:
|
"revIndex": "" + (inputTitles.length - 1 - index),
|
||||||
return widget.getVariable(name);
|
"length": "" + inputTitles.length
|
||||||
|
};
|
||||||
|
if(name in opts.variables) {
|
||||||
|
return opts.variables[name];
|
||||||
|
} else {
|
||||||
|
return widget.getVariable(name,opts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
results.push(filtered[0] || "");
|
results.push(filtered[0] || "");
|
||||||
|
++index;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,26 +15,24 @@ Export our filter prefix function
|
|||||||
exports.reduce = function(operationSubFunction,options) {
|
exports.reduce = function(operationSubFunction,options) {
|
||||||
return function(results,source,widget) {
|
return function(results,source,widget) {
|
||||||
if(results.length > 0) {
|
if(results.length > 0) {
|
||||||
var accumulator = "";
|
var accumulator = "",
|
||||||
var index = 0;
|
index = 0;
|
||||||
results.each(function(title) {
|
results.each(function(title) {
|
||||||
var list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{
|
var list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{
|
||||||
getVariable: function(name) {
|
getVariable: function(name,opts) {
|
||||||
switch(name) {
|
opts = opts || {};
|
||||||
case "currentTiddler":
|
opts.variables = {
|
||||||
return "" + title;
|
"currentTiddler": "" + title,
|
||||||
case "..currentTiddler":
|
"..currentTiddler": widget.getVariable("currentTiddler"),
|
||||||
return widget.getVariable("currentTiddler");
|
"index": "" + index,
|
||||||
case "accumulator":
|
"revIndex": "" + (results.length - 1 - index),
|
||||||
return "" + accumulator;
|
"length": "" + results.length,
|
||||||
case "index":
|
"accumulator": "" + accumulator
|
||||||
return "" + index;
|
};
|
||||||
case "revIndex":
|
if(name in opts.variables) {
|
||||||
return "" + (results.length - 1 - index);
|
return opts.variables[name];
|
||||||
case "length":
|
} else {
|
||||||
return "" + results.length;
|
return widget.getVariable(name,opts);
|
||||||
default:
|
|
||||||
return widget.getVariable(name);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -26,14 +26,16 @@ exports.sort = function(operationSubFunction,options) {
|
|||||||
compareFn;
|
compareFn;
|
||||||
results.each(function(title) {
|
results.each(function(title) {
|
||||||
var key = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{
|
var key = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{
|
||||||
getVariable: function(name) {
|
getVariable: function(name,opts) {
|
||||||
switch(name) {
|
opts = opts || {};
|
||||||
case "currentTiddler":
|
opts.variables = {
|
||||||
return "" + title;
|
"currentTiddler": "" + title,
|
||||||
case "..currentTiddler":
|
"..currentTiddler": widget.getVariable("currentTiddler")
|
||||||
return widget.getVariable("currentTiddler");
|
};
|
||||||
default:
|
if(name in opts.variables) {
|
||||||
return widget.getVariable(name);
|
return opts.variables[name];
|
||||||
|
} else {
|
||||||
|
return widget.getVariable(name,opts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -95,10 +95,12 @@ function parseFilterOperation(operators,filterString,p) {
|
|||||||
if(nextBracketPos === -1) {
|
if(nextBracketPos === -1) {
|
||||||
throw "Missing closing bracket in filter expression";
|
throw "Missing closing bracket in filter expression";
|
||||||
}
|
}
|
||||||
if(!operator.regexp) {
|
if(operator.regexp) {
|
||||||
|
operand.text = "";
|
||||||
|
} else {
|
||||||
operand.text = filterString.substring(p,nextBracketPos);
|
operand.text = filterString.substring(p,nextBracketPos);
|
||||||
operator.operands.push(operand);
|
|
||||||
}
|
}
|
||||||
|
operator.operands.push(operand);
|
||||||
p = nextBracketPos + 1;
|
p = nextBracketPos + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ exports.all = function(source,operator,options) {
|
|||||||
results.pushTop(subop(source,operator.prefix,options));
|
results.pushTop(subop(source,operator.prefix,options));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return results.toArray();
|
return results.makeTiddlerIterator(options.wiki);
|
||||||
};
|
};
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ Filter operator for returning all the backlinks from a tiddler
|
|||||||
Export our filter function
|
Export our filter function
|
||||||
*/
|
*/
|
||||||
exports.backlinks = function(source,operator,options) {
|
exports.backlinks = function(source,operator,options) {
|
||||||
var results = [];
|
var results = new $tw.utils.LinkedList();
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));
|
results.pushTop(options.wiki.getTiddlerBacklinks(title));
|
||||||
});
|
});
|
||||||
return results;
|
return results.makeTiddlerIterator(options.wiki);
|
||||||
};
|
};
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
27
core/modules/filters/crypto.js
Normal file
27
core/modules/filters/crypto.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/core/modules/filters/crypto.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: filteroperator
|
||||||
|
|
||||||
|
Filter operators for cryptography, using the Stanford JavaScript library
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.sha256 = function(source,operator,options) {
|
||||||
|
var results = [],
|
||||||
|
length = parseInt(operator.operand,10) || 20,
|
||||||
|
sha256 = function(text) {
|
||||||
|
return sjcl.codec.hex.fromBits(sjcl.hash.sha256.hash(text)).substr(0,length);
|
||||||
|
};
|
||||||
|
source(function(tiddler,title) {
|
||||||
|
results.push(sha256(title));
|
||||||
|
});
|
||||||
|
return results;
|
||||||
|
};
|
||||||
|
|
||||||
|
})();
|
||||||
@@ -19,12 +19,7 @@ Export our filter functions
|
|||||||
exports.decodeuricomponent = function(source,operator,options) {
|
exports.decodeuricomponent = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [];
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
var value = title;
|
results.push($tw.utils.decodeURIComponentSafe(title));
|
||||||
try {
|
|
||||||
value = decodeURIComponent(title);
|
|
||||||
} catch(e) {
|
|
||||||
}
|
|
||||||
results.push(value);
|
|
||||||
});
|
});
|
||||||
return results;
|
return results;
|
||||||
};
|
};
|
||||||
@@ -40,12 +35,7 @@ exports.encodeuricomponent = function(source,operator,options) {
|
|||||||
exports.decodeuri = function(source,operator,options) {
|
exports.decodeuri = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [];
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
var value = title;
|
results.push($tw.utils.decodeURISafe(title));
|
||||||
try {
|
|
||||||
value = decodeURI(title);
|
|
||||||
} catch(e) {
|
|
||||||
}
|
|
||||||
results.push(value);
|
|
||||||
});
|
});
|
||||||
return results;
|
return results;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ exports.links = function(source,operator,options) {
|
|||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
results.pushTop(options.wiki.getTiddlerLinks(title));
|
results.pushTop(options.wiki.getTiddlerLinks(title));
|
||||||
});
|
});
|
||||||
return results.toArray();
|
return results.makeTiddlerIterator(options.wiki);
|
||||||
};
|
};
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -103,4 +103,16 @@ exports.nth = function(source,operator,options) {
|
|||||||
return results.slice(count - 1,count);
|
return results.slice(count - 1,count);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
The zero based nth member of the list
|
||||||
|
*/
|
||||||
|
exports.zth = function(source,operator,options) {
|
||||||
|
var count = $tw.utils.getInt(operator.operand,0),
|
||||||
|
results = [];
|
||||||
|
source(function(tiddler,title) {
|
||||||
|
results.push(title);
|
||||||
|
});
|
||||||
|
return results.slice(count,count + 1);
|
||||||
|
};
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -165,6 +165,35 @@ exports["standard-deviation"] = makeNumericReducingOperator(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//trigonometry
|
||||||
|
exports.cos = makeNumericBinaryOperator(
|
||||||
|
function(a) {return Math.cos(a)}
|
||||||
|
);
|
||||||
|
|
||||||
|
exports.sin = makeNumericBinaryOperator(
|
||||||
|
function(a) {return Math.sin(a)}
|
||||||
|
);
|
||||||
|
|
||||||
|
exports.tan = makeNumericBinaryOperator(
|
||||||
|
function(a) {return Math.tan(a)}
|
||||||
|
);
|
||||||
|
|
||||||
|
exports.acos = makeNumericBinaryOperator(
|
||||||
|
function(a) {return Math.acos(a)}
|
||||||
|
);
|
||||||
|
|
||||||
|
exports.asin = makeNumericBinaryOperator(
|
||||||
|
function(a) {return Math.asin(a)}
|
||||||
|
);
|
||||||
|
|
||||||
|
exports.atan = makeNumericBinaryOperator(
|
||||||
|
function(a) {return Math.atan(a)}
|
||||||
|
);
|
||||||
|
|
||||||
|
exports.atan2 = makeNumericBinaryOperator(
|
||||||
|
function(a,b) {return Math.atan2(a,b)}
|
||||||
|
);
|
||||||
|
|
||||||
//Calculate the variance of a population of numbers in an array given its mean
|
//Calculate the variance of a population of numbers in an array given its mean
|
||||||
function getVarianceFromArray(values,mean) {
|
function getVarianceFromArray(values,mean) {
|
||||||
var deviationTotal = values.reduce(function(accumulator,value) {
|
var deviationTotal = values.reduce(function(accumulator,value) {
|
||||||
|
|||||||
30
core/modules/filters/moduleproperty.js
Normal file
30
core/modules/filters/moduleproperty.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/core/modules/filters/moduleproperty.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: filteroperator
|
||||||
|
|
||||||
|
Filter [[module-name]moduleproperty[name]] retrieve a module property
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
/*
|
||||||
|
Export our filter function
|
||||||
|
*/
|
||||||
|
exports.moduleproperty = function(source,operator,options) {
|
||||||
|
var results = [];
|
||||||
|
source(function(tiddler,title) {
|
||||||
|
var value = require(title)[operator.operand || ""];
|
||||||
|
if(value !== undefined) {
|
||||||
|
results.push(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
results.sort();
|
||||||
|
return results;
|
||||||
|
};
|
||||||
|
|
||||||
|
})();
|
||||||
@@ -17,11 +17,23 @@ Export our filter function
|
|||||||
*/
|
*/
|
||||||
exports.modules = function(source,operator,options) {
|
exports.modules = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [];
|
||||||
source(function(tiddler,title) {
|
if(operator.operands.length >= 2) {
|
||||||
$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {
|
// Return the modules that have the module property specified in the first operand with the value in the second operand
|
||||||
results.push(moduleName);
|
source(function(tiddler,title) {
|
||||||
|
$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {
|
||||||
|
if(require(moduleName)[operator.operands[0]] === operator.operands[1]) {
|
||||||
|
results.push(moduleName);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
} else {
|
||||||
|
// Return all the module names without filtering
|
||||||
|
source(function(tiddler,title) {
|
||||||
|
$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {
|
||||||
|
results.push(moduleName);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
results.sort();
|
results.sort();
|
||||||
return results;
|
return results;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -17,9 +17,13 @@ Export our filter function
|
|||||||
*/
|
*/
|
||||||
exports.range = function(source,operator,options) {
|
exports.range = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [];
|
||||||
// Split the operand into numbers delimited by these symbols
|
// For backwards compatibility, if there is only one operand, try to split it using one of the delimiters
|
||||||
var parts = operator.operand.split(/[,:;]/g),
|
var parts = operator.operands || [];
|
||||||
beg, end, inc, i, fixed = 0;
|
if(parts.length === 1) {
|
||||||
|
parts = operator.operand.split(/[,:;]/g);
|
||||||
|
}
|
||||||
|
// Process the parts
|
||||||
|
var beg, end, inc, i, fixed = 0;
|
||||||
for (i=0; i<parts.length; i++) {
|
for (i=0; i<parts.length; i++) {
|
||||||
// Validate real number
|
// Validate real number
|
||||||
if(!/^\s*[+-]?((\d+(\.\d*)?)|(\.\d+))\s*$/.test(parts[i])) {
|
if(!/^\s*[+-]?((\d+(\.\d*)?)|(\.\d+))\s*$/.test(parts[i])) {
|
||||||
|
|||||||
@@ -119,23 +119,25 @@ exports["search-replace"] = function(source,operator,options) {
|
|||||||
var results = [],
|
var results = [],
|
||||||
suffixes = operator.suffixes || [],
|
suffixes = operator.suffixes || [],
|
||||||
flagSuffix = (suffixes[0] ? (suffixes[0][0] || "") : ""),
|
flagSuffix = (suffixes[0] ? (suffixes[0][0] || "") : ""),
|
||||||
flags = (flagSuffix.indexOf("g") !== -1 ? "g" : "") + (flagSuffix.indexOf("i") !== -1 ? "i" : ""),
|
flags = (flagSuffix.indexOf("g") !== -1 ? "g" : "") + (flagSuffix.indexOf("i") !== -1 ? "i" : "") + (flagSuffix.indexOf("m") !== -1 ? "m" : ""),
|
||||||
isRegExp = (suffixes[1] && suffixes[1][0] === "regexp") ? true : false,
|
isRegExp = (suffixes[1] && suffixes[1][0] === "regexp") ? true : false,
|
||||||
searchTerm,
|
//Escape regexp characters if the operand is not a regular expression
|
||||||
|
searchTerm = isRegExp ? operator.operand : $tw.utils.escapeRegExp(operator.operand),
|
||||||
|
//Escape $ character in replacement string if not in regular expression mode
|
||||||
|
replacement = isRegExp ? operator.operands[1] : (operator.operands[1]||"").replace(/\$/g,"$$$$"),
|
||||||
regExp;
|
regExp;
|
||||||
|
try {
|
||||||
|
regExp = new RegExp(searchTerm,flags);
|
||||||
|
} catch(ex) {
|
||||||
|
return ["RegExp error: " + ex];
|
||||||
|
}
|
||||||
|
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
if(title && (operator.operands.length > 1)) {
|
if(title && (operator.operands.length > 1)) {
|
||||||
//Escape regexp characters if the operand is not a regular expression
|
|
||||||
searchTerm = isRegExp ? operator.operand : $tw.utils.escapeRegExp(operator.operand);
|
|
||||||
try {
|
|
||||||
regExp = new RegExp(searchTerm,flags);
|
|
||||||
} catch(ex) {
|
|
||||||
return ["RegExp error: " + ex];
|
|
||||||
}
|
|
||||||
results.push(
|
results.push(
|
||||||
title.replace(regExp,operator.operands[1])
|
title.replace(regExp,replacement)
|
||||||
);
|
);
|
||||||
|
regExp.lastIndex = 0;
|
||||||
} else {
|
} else {
|
||||||
results.push(title);
|
results.push(title);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,20 +16,13 @@ Filter operator returning all the selected tiddlers that are untagged
|
|||||||
Export our filter function
|
Export our filter function
|
||||||
*/
|
*/
|
||||||
exports.untagged = function(source,operator,options) {
|
exports.untagged = function(source,operator,options) {
|
||||||
var results = [];
|
var results = [],
|
||||||
if(operator.prefix === "!") {
|
expected = (operator.prefix === "!");
|
||||||
source(function(tiddler,title) {
|
source(function(tiddler,title) {
|
||||||
if(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {
|
if((tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) === expected) {
|
||||||
$tw.utils.pushTop(results,title);
|
results.push(title);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
source(function(tiddler,title) {
|
|
||||||
if(!tiddler || !tiddler.hasField("tags") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {
|
|
||||||
$tw.utils.pushTop(results,title);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return results;
|
return results;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ exports.parse = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Look for an HTML tag. Returns null if not found, otherwise returns {type: "element", name:, attributes: [], isSelfClosing:, start:, end:,}
|
Look for an HTML tag. Returns null if not found, otherwise returns {type: "element", name:, attributes: {}, orderedAttributes: [], isSelfClosing:, start:, end:,}
|
||||||
*/
|
*/
|
||||||
exports.parseTag = function(source,pos,options) {
|
exports.parseTag = function(source,pos,options) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
@@ -74,7 +74,8 @@ exports.parseTag = function(source,pos,options) {
|
|||||||
node = {
|
node = {
|
||||||
type: "element",
|
type: "element",
|
||||||
start: pos,
|
start: pos,
|
||||||
attributes: {}
|
attributes: {},
|
||||||
|
orderedAttributes: []
|
||||||
};
|
};
|
||||||
// Define our regexps
|
// Define our regexps
|
||||||
var reTagName = /([a-zA-Z0-9\-\$]+)/g;
|
var reTagName = /([a-zA-Z0-9\-\$]+)/g;
|
||||||
@@ -106,6 +107,7 @@ exports.parseTag = function(source,pos,options) {
|
|||||||
// Process attributes
|
// Process attributes
|
||||||
var attribute = $tw.utils.parseAttribute(source,pos);
|
var attribute = $tw.utils.parseAttribute(source,pos);
|
||||||
while(attribute) {
|
while(attribute) {
|
||||||
|
node.orderedAttributes.push(attribute);
|
||||||
node.attributes[attribute.name] = attribute;
|
node.attributes[attribute.name] = attribute;
|
||||||
pos = attribute.end;
|
pos = attribute.end;
|
||||||
// Get the next attribute
|
// Get the next attribute
|
||||||
|
|||||||
@@ -231,7 +231,10 @@ WikiParser.prototype.parseBlock = function(terminatorRegExpString) {
|
|||||||
return nextMatch.rule.parse();
|
return nextMatch.rule.parse();
|
||||||
}
|
}
|
||||||
// Treat it as a paragraph if we didn't find a block rule
|
// Treat it as a paragraph if we didn't find a block rule
|
||||||
return [{type: "element", tag: "p", children: this.parseInlineRun(terminatorRegExp)}];
|
var start = this.pos;
|
||||||
|
var children = this.parseInlineRun(terminatorRegExp);
|
||||||
|
var end = this.pos;
|
||||||
|
return [{type: "element", tag: "p", children: children, start: start, end: end }];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -307,7 +310,7 @@ WikiParser.prototype.parseInlineRunUnterminated = function(options) {
|
|||||||
while(this.pos < this.sourceLength && nextMatch) {
|
while(this.pos < this.sourceLength && nextMatch) {
|
||||||
// Process the text preceding the run rule
|
// Process the text preceding the run rule
|
||||||
if(nextMatch.matchIndex > this.pos) {
|
if(nextMatch.matchIndex > this.pos) {
|
||||||
this.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex));
|
this.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex),this.pos,nextMatch.matchIndex);
|
||||||
this.pos = nextMatch.matchIndex;
|
this.pos = nextMatch.matchIndex;
|
||||||
}
|
}
|
||||||
// Process the run rule
|
// Process the run rule
|
||||||
@@ -317,7 +320,7 @@ WikiParser.prototype.parseInlineRunUnterminated = function(options) {
|
|||||||
}
|
}
|
||||||
// Process the remaining text
|
// Process the remaining text
|
||||||
if(this.pos < this.sourceLength) {
|
if(this.pos < this.sourceLength) {
|
||||||
this.pushTextWidget(tree,this.source.substr(this.pos));
|
this.pushTextWidget(tree,this.source.substr(this.pos),this.pos,this.sourceLength);
|
||||||
}
|
}
|
||||||
this.pos = this.sourceLength;
|
this.pos = this.sourceLength;
|
||||||
return tree;
|
return tree;
|
||||||
@@ -337,7 +340,7 @@ WikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,option
|
|||||||
if(terminatorMatch) {
|
if(terminatorMatch) {
|
||||||
if(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {
|
if(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {
|
||||||
if(terminatorMatch.index > this.pos) {
|
if(terminatorMatch.index > this.pos) {
|
||||||
this.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index));
|
this.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index),this.pos,terminatorMatch.index);
|
||||||
}
|
}
|
||||||
this.pos = terminatorMatch.index;
|
this.pos = terminatorMatch.index;
|
||||||
if(options.eatTerminator) {
|
if(options.eatTerminator) {
|
||||||
@@ -350,7 +353,7 @@ WikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,option
|
|||||||
if(inlineRuleMatch) {
|
if(inlineRuleMatch) {
|
||||||
// Preceding text
|
// Preceding text
|
||||||
if(inlineRuleMatch.matchIndex > this.pos) {
|
if(inlineRuleMatch.matchIndex > this.pos) {
|
||||||
this.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex));
|
this.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex),this.pos,inlineRuleMatch.matchIndex);
|
||||||
this.pos = inlineRuleMatch.matchIndex;
|
this.pos = inlineRuleMatch.matchIndex;
|
||||||
}
|
}
|
||||||
// Process the inline rule
|
// Process the inline rule
|
||||||
@@ -364,7 +367,7 @@ WikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,option
|
|||||||
}
|
}
|
||||||
// Process the remaining text
|
// Process the remaining text
|
||||||
if(this.pos < this.sourceLength) {
|
if(this.pos < this.sourceLength) {
|
||||||
this.pushTextWidget(tree,this.source.substr(this.pos));
|
this.pushTextWidget(tree,this.source.substr(this.pos),this.pos,this.sourceLength);
|
||||||
}
|
}
|
||||||
this.pos = this.sourceLength;
|
this.pos = this.sourceLength;
|
||||||
return tree;
|
return tree;
|
||||||
@@ -373,12 +376,12 @@ WikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,option
|
|||||||
/*
|
/*
|
||||||
Push a text widget onto an array, respecting the configTrimWhiteSpace setting
|
Push a text widget onto an array, respecting the configTrimWhiteSpace setting
|
||||||
*/
|
*/
|
||||||
WikiParser.prototype.pushTextWidget = function(array,text) {
|
WikiParser.prototype.pushTextWidget = function(array,text,start,end) {
|
||||||
if(this.configTrimWhiteSpace) {
|
if(this.configTrimWhiteSpace) {
|
||||||
text = $tw.utils.trim(text);
|
text = $tw.utils.trim(text);
|
||||||
}
|
}
|
||||||
if(text) {
|
if(text) {
|
||||||
array.push({type: "text", text: text});
|
array.push({type: "text", text: text, start: start, end: end});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ AndTidWiki.prototype.save = function(text,method,callback,options) {
|
|||||||
window.twi.saveWiki(text);
|
window.twi.saveWiki(text);
|
||||||
} else {
|
} else {
|
||||||
// Get the pathname of this document
|
// Get the pathname of this document
|
||||||
var pathname = decodeURIComponent(document.location.toString().split("#")[0]);
|
var pathname = $tw.utils.decodeURIComponentSafe(document.location.toString().split("#")[0]);
|
||||||
// Strip the file://
|
// Strip the file://
|
||||||
if(pathname.indexOf("file://") === 0) {
|
if(pathname.indexOf("file://") === 0) {
|
||||||
pathname = pathname.substr(7);
|
pathname = pathname.substr(7);
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ DownloadSaver.prototype.save = function(text,method,callback,options) {
|
|||||||
var p = document.location.pathname.lastIndexOf("/");
|
var p = document.location.pathname.lastIndexOf("/");
|
||||||
if(p !== -1) {
|
if(p !== -1) {
|
||||||
// We decode the pathname because document.location is URL encoded by the browser
|
// We decode the pathname because document.location is URL encoded by the browser
|
||||||
filename = decodeURIComponent(document.location.pathname.substr(p+1));
|
filename = $tw.utils.decodeURIComponentSafe(document.location.pathname.substr(p+1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!filename) {
|
if(!filename) {
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ GiteaSaver.prototype.save = function(text,method,callback) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
var data = {
|
var data = {
|
||||||
message: $tw.language.getRawString("ControlPanel/Saving/GitService/CommitMessage"),
|
message: $tw.language.getString("ControlPanel/Saving/GitService/CommitMessage"),
|
||||||
content: $tw.utils.base64Encode(text),
|
content: $tw.utils.base64Encode(text),
|
||||||
sha: sha
|
sha: sha
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ GitHubSaver.prototype.save = function(text,method,callback) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
var data = {
|
var data = {
|
||||||
message: $tw.language.getRawString("ControlPanel/Saving/GitService/CommitMessage"),
|
message: $tw.language.getString("ControlPanel/Saving/GitService/CommitMessage"),
|
||||||
content: $tw.utils.base64Encode(text),
|
content: $tw.utils.base64Encode(text),
|
||||||
branch: branch,
|
branch: branch,
|
||||||
sha: sha
|
sha: sha
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ GitLabSaver.prototype.save = function(text,method,callback) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
var data = {
|
var data = {
|
||||||
commit_message: $tw.language.getRawString("ControlPanel/Saving/GitService/CommitMessage"),
|
commit_message: $tw.language.getString("ControlPanel/Saving/GitService/CommitMessage"),
|
||||||
content: text,
|
content: text,
|
||||||
branch: branch,
|
branch: branch,
|
||||||
sha: sha
|
sha: sha
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ TiddlyFoxSaver.prototype.save = function(text,method,callback) {
|
|||||||
}
|
}
|
||||||
// Create the message element and put it in the message box
|
// Create the message element and put it in the message box
|
||||||
var message = document.createElement("div");
|
var message = document.createElement("div");
|
||||||
message.setAttribute("data-tiddlyfox-path",decodeURIComponent(pathname));
|
message.setAttribute("data-tiddlyfox-path",$tw.utils.decodeURIComponentSafe(pathname));
|
||||||
message.setAttribute("data-tiddlyfox-content",text);
|
message.setAttribute("data-tiddlyfox-content",text);
|
||||||
messageBox.appendChild(message);
|
messageBox.appendChild(message);
|
||||||
// Add an event handler for when the file has been saved
|
// Add an event handler for when the file has been saved
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ TWEditSaver.prototype.save = function(text,method,callback) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Get the pathname of this document
|
// Get the pathname of this document
|
||||||
var pathname = decodeURIComponent(document.location.pathname);
|
var pathname = $tw.utils.decodeURIComponentSafe(document.location.pathname);
|
||||||
// Strip any query or location part
|
// Strip any query or location part
|
||||||
var p = pathname.indexOf("?");
|
var p = pathname.indexOf("?");
|
||||||
if(p !== -1) {
|
if(p !== -1) {
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ exports.method = "DELETE";
|
|||||||
exports.path = /^\/bags\/default\/tiddlers\/(.+)$/;
|
exports.path = /^\/bags\/default\/tiddlers\/(.+)$/;
|
||||||
|
|
||||||
exports.handler = function(request,response,state) {
|
exports.handler = function(request,response,state) {
|
||||||
var title = decodeURIComponent(state.params[0]);
|
var title = $tw.utils.decodeURIComponentSafe(state.params[0]);
|
||||||
state.wiki.deleteTiddler(title);
|
state.wiki.deleteTiddler(title);
|
||||||
response.writeHead(204, "OK", {
|
response.writeHead(204, "OK", {
|
||||||
"Content-Type": "text/plain"
|
"Content-Type": "text/plain"
|
||||||
|
|||||||
@@ -20,22 +20,29 @@ exports.handler = function(request,response,state) {
|
|||||||
var path = require("path"),
|
var path = require("path"),
|
||||||
fs = require("fs"),
|
fs = require("fs"),
|
||||||
util = require("util"),
|
util = require("util"),
|
||||||
suppliedFilename = decodeURIComponent(state.params[0]),
|
suppliedFilename = $tw.utils.decodeURIComponentSafe(state.params[0]),
|
||||||
filename = path.resolve(state.boot.wikiPath,"files",suppliedFilename),
|
baseFilename = path.resolve(state.boot.wikiPath,"files"),
|
||||||
|
filename = path.resolve(baseFilename,suppliedFilename),
|
||||||
extension = path.extname(filename);
|
extension = path.extname(filename);
|
||||||
fs.readFile(filename,function(err,content) {
|
// Check that the filename is inside the wiki files folder
|
||||||
var status,content,type = "text/plain";
|
if(path.relative(baseFilename,filename).indexOf("..") !== 0) {
|
||||||
if(err) {
|
// Send the file
|
||||||
console.log("Error accessing file " + filename + ": " + err.toString());
|
fs.readFile(filename,function(err,content) {
|
||||||
status = 404;
|
var status,content,type = "text/plain";
|
||||||
content = "File '" + suppliedFilename + "' not found";
|
if(err) {
|
||||||
} else {
|
console.log("Error accessing file " + filename + ": " + err.toString());
|
||||||
status = 200;
|
status = 404;
|
||||||
content = content;
|
content = "File '" + suppliedFilename + "' not found";
|
||||||
type = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : "application/octet-stream");
|
} else {
|
||||||
}
|
status = 200;
|
||||||
state.sendResponse(status,{"Content-Type": type},content);
|
content = content;
|
||||||
});
|
type = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : "application/octet-stream");
|
||||||
|
}
|
||||||
|
state.sendResponse(status,{"Content-Type": type},content);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
state.sendResponse(404,{"Content-Type": "text/plain"},"File '" + suppliedFilename + "' not found");
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}());
|
}());
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ exports.handler = function(request,response,state) {
|
|||||||
username: state.authenticatedUsername || state.server.get("anon-username") || "",
|
username: state.authenticatedUsername || state.server.get("anon-username") || "",
|
||||||
anonymous: !state.authenticatedUsername,
|
anonymous: !state.authenticatedUsername,
|
||||||
read_only: !state.server.isAuthorized("writers",state.authenticatedUsername),
|
read_only: !state.server.isAuthorized("writers",state.authenticatedUsername),
|
||||||
sse_enabled: state.server.get("sse-enabled") === "yes",
|
|
||||||
space: {
|
space: {
|
||||||
recipe: "default"
|
recipe: "default"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ exports.method = "GET";
|
|||||||
exports.path = /^\/([^\/]+)$/;
|
exports.path = /^\/([^\/]+)$/;
|
||||||
|
|
||||||
exports.handler = function(request,response,state) {
|
exports.handler = function(request,response,state) {
|
||||||
var title = decodeURIComponent(state.params[0]),
|
var title = $tw.utils.decodeURIComponentSafe(state.params[0]),
|
||||||
tiddler = state.wiki.getTiddler(title);
|
tiddler = state.wiki.getTiddler(title);
|
||||||
if(tiddler) {
|
if(tiddler) {
|
||||||
var renderType = tiddler.getFieldString("_render_type"),
|
var renderType = tiddler.getFieldString("_render_type"),
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ exports.method = "GET";
|
|||||||
exports.path = /^\/recipes\/default\/tiddlers\/(.+)$/;
|
exports.path = /^\/recipes\/default\/tiddlers\/(.+)$/;
|
||||||
|
|
||||||
exports.handler = function(request,response,state) {
|
exports.handler = function(request,response,state) {
|
||||||
var title = decodeURIComponent(state.params[0]),
|
var title = $tw.utils.decodeURIComponentSafe(state.params[0]),
|
||||||
tiddler = state.wiki.getTiddler(title),
|
tiddler = state.wiki.getTiddler(title),
|
||||||
tiddlerFields = {},
|
tiddlerFields = {},
|
||||||
knownFields = [
|
knownFields = [
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ exports.method = "PUT";
|
|||||||
exports.path = /^\/recipes\/default\/tiddlers\/(.+)$/;
|
exports.path = /^\/recipes\/default\/tiddlers\/(.+)$/;
|
||||||
|
|
||||||
exports.handler = function(request,response,state) {
|
exports.handler = function(request,response,state) {
|
||||||
var title = decodeURIComponent(state.params[0]),
|
var title = $tw.utils.decodeURIComponentSafe(state.params[0]),
|
||||||
fields = JSON.parse(state.data);
|
fields = JSON.parse(state.data);
|
||||||
// Pull up any subfields in the `fields` object
|
// Pull up any subfields in the `fields` object
|
||||||
if(fields.fields) {
|
if(fields.fields) {
|
||||||
@@ -30,7 +30,7 @@ exports.handler = function(request,response,state) {
|
|||||||
if(fields.revision) {
|
if(fields.revision) {
|
||||||
delete fields.revision;
|
delete fields.revision;
|
||||||
}
|
}
|
||||||
state.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title},state.wiki.getModificationFields()));
|
state.wiki.addTiddler(new $tw.Tiddler(fields,{title: title}));
|
||||||
var changeCount = state.wiki.getChangeCount(title).toString();
|
var changeCount = state.wiki.getChangeCount(title).toString();
|
||||||
response.writeHead(204, "OK",{
|
response.writeHead(204, "OK",{
|
||||||
Etag: "\"default/" + encodeURIComponent(title) + "/" + changeCount + ":\"",
|
Etag: "\"default/" + encodeURIComponent(title) + "/" + changeCount + ":\"",
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
/*\
|
|
||||||
title: $:/core/modules/server/server-sent-events.js
|
|
||||||
type: application/javascript
|
|
||||||
module-type: library
|
|
||||||
\*/
|
|
||||||
(function(){
|
|
||||||
|
|
||||||
/*jslint node: true, browser: true */
|
|
||||||
/*global $tw: false */
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/*
|
|
||||||
parameters:
|
|
||||||
prefix - usually the plugin path, such as `plugins/tiddlywiki/tiddlyweb`. The
|
|
||||||
route will match `/events/${prefix}` exactly.
|
|
||||||
|
|
||||||
handler - a function that will be called each time a request comes in with the
|
|
||||||
request and state from the route and an emit function to call.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var ServerSentEvents = function ServerSentEvents(prefix, handler) {
|
|
||||||
this.handler = handler;
|
|
||||||
this.prefix = prefix;
|
|
||||||
};
|
|
||||||
|
|
||||||
ServerSentEvents.prototype.getExports = function() {
|
|
||||||
return {
|
|
||||||
bodyFormat: "stream",
|
|
||||||
method: "GET",
|
|
||||||
path: new RegExp("^/events/" + this.prefix + "$"),
|
|
||||||
handler: this.handleEventRequest.bind(this)
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
ServerSentEvents.prototype.handleEventRequest = function(request,response,state) {
|
|
||||||
if(ServerSentEvents.prototype.isEventStreamRequest(request)) {
|
|
||||||
response.writeHead(200, {
|
|
||||||
"Content-Type": "text/event-stream",
|
|
||||||
"Cache-Control": "no-cache",
|
|
||||||
"Connection": "keep-alive"
|
|
||||||
});
|
|
||||||
this.handler(request,state,this.emit.bind(this,response),this.end.bind(this,response));
|
|
||||||
} else {
|
|
||||||
response.writeHead(406,"Not Acceptable",{});
|
|
||||||
response.end();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
ServerSentEvents.prototype.isEventStreamRequest = function(request) {
|
|
||||||
return request.headers.accept &&
|
|
||||||
request.headers.accept.match(/^text\/event-stream/);
|
|
||||||
};
|
|
||||||
|
|
||||||
ServerSentEvents.prototype.emit = function(response,event,data) {
|
|
||||||
if(typeof event !== "string" || event.indexOf("\n") !== -1) {
|
|
||||||
throw new Error("Type must be a single-line string");
|
|
||||||
}
|
|
||||||
if(typeof data !== "string" || data.indexOf("\n") !== -1) {
|
|
||||||
throw new Error("Data must be a single-line string");
|
|
||||||
}
|
|
||||||
response.write("event: " + event + "\ndata: " + data + "\n\n", "utf8");
|
|
||||||
};
|
|
||||||
|
|
||||||
ServerSentEvents.prototype.end = function(response) {
|
|
||||||
response.end();
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.ServerSentEvents = ServerSentEvents;
|
|
||||||
|
|
||||||
})();
|
|
||||||
@@ -51,6 +51,20 @@ exports.startup = function() {
|
|||||||
element.focus(event.paramObject);
|
element.focus(event.paramObject);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
// Install the tm-rename-tiddler and tm-relink-tiddler messages
|
||||||
|
var makeRenameHandler = function(method) {
|
||||||
|
return function(event) {
|
||||||
|
var options = {},
|
||||||
|
paramObject = event.paramObject || {},
|
||||||
|
from = paramObject.from || event.tiddlerTitle,
|
||||||
|
to = paramObject.to;
|
||||||
|
options.dontRenameInTags = (paramObject.renameInTags === "false" || paramObject.renameInTags === "no") ? true : false;
|
||||||
|
options.dontRenameInLists = (paramObject.renameInLists === "false" || paramObject.renameInLists === "no") ? true : false;
|
||||||
|
$tw.wiki[method](from,to,options);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
$tw.rootWidget.addEventListener("tm-rename-tiddler",makeRenameHandler("renameTiddler"));
|
||||||
|
$tw.rootWidget.addEventListener("tm-relink-tiddler",makeRenameHandler("relinkTiddler"));
|
||||||
// Install the scroller
|
// Install the scroller
|
||||||
$tw.pageScroller = new $tw.utils.PageScroller();
|
$tw.pageScroller = new $tw.utils.PageScroller();
|
||||||
$tw.rootWidget.addEventListener("tm-scroll",function(event) {
|
$tw.rootWidget.addEventListener("tm-scroll",function(event) {
|
||||||
|
|||||||
@@ -120,10 +120,10 @@ function openStartupTiddlers(options) {
|
|||||||
var hash = $tw.locationHash.substr(1),
|
var hash = $tw.locationHash.substr(1),
|
||||||
split = hash.indexOf(":");
|
split = hash.indexOf(":");
|
||||||
if(split === -1) {
|
if(split === -1) {
|
||||||
target = decodeURIComponent(hash.trim());
|
target = $tw.utils.decodeURIComponentSafe(hash.trim());
|
||||||
} else {
|
} else {
|
||||||
target = decodeURIComponent(hash.substr(0,split).trim());
|
target = $tw.utils.decodeURIComponentSafe(hash.substr(0,split).trim());
|
||||||
storyFilter = decodeURIComponent(hash.substr(split + 1).trim());
|
storyFilter = $tw.utils.decodeURIComponentSafe(hash.substr(split + 1).trim());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If the story wasn't specified use the current tiddlers or a blank story
|
// If the story wasn't specified use the current tiddlers or a blank story
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ Syncer.prototype.titleIsAnonymous = "$:/status/IsAnonymous";
|
|||||||
Syncer.prototype.titleIsReadOnly = "$:/status/IsReadOnly";
|
Syncer.prototype.titleIsReadOnly = "$:/status/IsReadOnly";
|
||||||
Syncer.prototype.titleUserName = "$:/status/UserName";
|
Syncer.prototype.titleUserName = "$:/status/UserName";
|
||||||
Syncer.prototype.titleSyncFilter = "$:/config/SyncFilter";
|
Syncer.prototype.titleSyncFilter = "$:/config/SyncFilter";
|
||||||
Syncer.prototype.titleSyncDisablePolling = "$:/config/SyncDisablePolling";
|
|
||||||
Syncer.prototype.titleSyncPollingInterval = "$:/config/SyncPollingInterval";
|
Syncer.prototype.titleSyncPollingInterval = "$:/config/SyncPollingInterval";
|
||||||
Syncer.prototype.titleSyncDisableLazyLoading = "$:/config/SyncDisableLazyLoading";
|
Syncer.prototype.titleSyncDisableLazyLoading = "$:/config/SyncDisableLazyLoading";
|
||||||
Syncer.prototype.titleSavedNotification = "$:/language/Notifications/Save/Done";
|
Syncer.prototype.titleSavedNotification = "$:/language/Notifications/Save/Done";
|
||||||
@@ -90,7 +89,7 @@ function Syncer(options) {
|
|||||||
if(filteredChanges.length > 0) {
|
if(filteredChanges.length > 0) {
|
||||||
self.processTaskQueue();
|
self.processTaskQueue();
|
||||||
} else {
|
} else {
|
||||||
// Look for deletions of tiddlers we're already syncing
|
// Look for deletions of tiddlers we're already syncing
|
||||||
var outstandingDeletion = false
|
var outstandingDeletion = false
|
||||||
$tw.utils.each(changes,function(change,title,object) {
|
$tw.utils.each(changes,function(change,title,object) {
|
||||||
if(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) {
|
if(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) {
|
||||||
@@ -122,7 +121,7 @@ function Syncer(options) {
|
|||||||
self.login(username,password,function() {});
|
self.login(username,password,function() {});
|
||||||
} else {
|
} else {
|
||||||
// No username and password, so we display a prompt
|
// No username and password, so we display a prompt
|
||||||
self.handleLoginEvent();
|
self.handleLoginEvent();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
$tw.rootWidget.addEventListener("tm-logout",function() {
|
$tw.rootWidget.addEventListener("tm-logout",function() {
|
||||||
@@ -139,7 +138,7 @@ function Syncer(options) {
|
|||||||
if(!this.disableUI && this.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== "yes") {
|
if(!this.disableUI && this.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== "yes") {
|
||||||
this.wiki.addEventListener("lazyLoad",function(title) {
|
this.wiki.addEventListener("lazyLoad",function(title) {
|
||||||
self.handleLazyLoadEvent(title);
|
self.handleLazyLoadEvent(title);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// Get the login status
|
// Get the login status
|
||||||
this.getStatus(function(err,isLoggedIn) {
|
this.getStatus(function(err,isLoggedIn) {
|
||||||
@@ -174,8 +173,8 @@ Syncer.prototype.getTiddlerRevision = function(title) {
|
|||||||
if(this.syncadaptor && this.syncadaptor.getTiddlerRevision) {
|
if(this.syncadaptor && this.syncadaptor.getTiddlerRevision) {
|
||||||
return this.syncadaptor.getTiddlerRevision(title);
|
return this.syncadaptor.getTiddlerRevision(title);
|
||||||
} else {
|
} else {
|
||||||
return this.wiki.getTiddler(title).fields.revision;
|
return this.wiki.getTiddler(title).fields.revision;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -268,9 +267,9 @@ Syncer.prototype.getStatus = function(callback) {
|
|||||||
// Mark us as not logged in
|
// Mark us as not logged in
|
||||||
this.wiki.addTiddler({title: this.titleIsLoggedIn,text: "no"});
|
this.wiki.addTiddler({title: this.titleIsLoggedIn,text: "no"});
|
||||||
// Get login status
|
// Get login status
|
||||||
this.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous,isPollingDisabled) {
|
this.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous) {
|
||||||
if(err) {
|
if(err) {
|
||||||
self.logger.alert(err);
|
self.displayError("Get Status Error",err);
|
||||||
} else {
|
} else {
|
||||||
// Set the various status tiddlers
|
// Set the various status tiddlers
|
||||||
self.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? "yes" : "no"});
|
self.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? "yes" : "no"});
|
||||||
@@ -279,9 +278,6 @@ Syncer.prototype.getStatus = function(callback) {
|
|||||||
if(isLoggedIn) {
|
if(isLoggedIn) {
|
||||||
self.wiki.addTiddler({title: self.titleUserName,text: username || ""});
|
self.wiki.addTiddler({title: self.titleUserName,text: username || ""});
|
||||||
}
|
}
|
||||||
if(isPollingDisabled) {
|
|
||||||
self.wiki.addTiddler({title: self.titleSyncDisablePolling, text: "yes"});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Invoke the callback
|
// Invoke the callback
|
||||||
if(callback) {
|
if(callback) {
|
||||||
@@ -305,15 +301,12 @@ Syncer.prototype.syncFromServer = function() {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
triggerNextSync = function() {
|
triggerNextSync = function() {
|
||||||
if(pollingEnabled) {
|
self.pollTimerId = setTimeout(function() {
|
||||||
self.pollTimerId = setTimeout(function() {
|
self.pollTimerId = null;
|
||||||
self.pollTimerId = null;
|
self.syncFromServer.call(self);
|
||||||
self.syncFromServer.call(self);
|
},self.pollTimerInterval);
|
||||||
},self.pollTimerInterval);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
syncSystemFromServer = (self.wiki.getTiddlerText("$:/config/SyncSystemTiddlersFromServer") === "yes"),
|
syncSystemFromServer = (self.wiki.getTiddlerText("$:/config/SyncSystemTiddlersFromServer") === "yes" ? true : false);
|
||||||
pollingEnabled = (self.wiki.getTiddlerText(self.titleSyncDisablePolling) !== "yes");
|
|
||||||
if(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) {
|
if(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) {
|
||||||
this.logger.log("Retrieving updated tiddler list");
|
this.logger.log("Retrieving updated tiddler list");
|
||||||
cancelNextSync();
|
cancelNextSync();
|
||||||
@@ -336,7 +329,7 @@ Syncer.prototype.syncFromServer = function() {
|
|||||||
});
|
});
|
||||||
if(updates.modifications.length > 0 || updates.deletions.length > 0) {
|
if(updates.modifications.length > 0 || updates.deletions.length > 0) {
|
||||||
self.processTaskQueue();
|
self.processTaskQueue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {
|
} else if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {
|
||||||
@@ -479,7 +472,7 @@ Syncer.prototype.handleLogoutEvent = function() {
|
|||||||
if(this.syncadaptor.logout) {
|
if(this.syncadaptor.logout) {
|
||||||
this.syncadaptor.logout(function(err) {
|
this.syncadaptor.logout(function(err) {
|
||||||
if(err) {
|
if(err) {
|
||||||
self.logger.alert(err);
|
self.displayError("Logout Error",err);
|
||||||
} else {
|
} else {
|
||||||
self.getStatus();
|
self.getStatus();
|
||||||
}
|
}
|
||||||
@@ -516,7 +509,7 @@ Syncer.prototype.processTaskQueue = function() {
|
|||||||
} else {
|
} else {
|
||||||
self.updateDirtyStatus();
|
self.updateDirtyStatus();
|
||||||
// Process the next task
|
// Process the next task
|
||||||
self.processTaskQueue.call(self);
|
self.processTaskQueue.call(self);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -524,11 +517,11 @@ Syncer.prototype.processTaskQueue = function() {
|
|||||||
this.updateDirtyStatus();
|
this.updateDirtyStatus();
|
||||||
// And trigger a timeout if there is a pending task
|
// And trigger a timeout if there is a pending task
|
||||||
if(task === true) {
|
if(task === true) {
|
||||||
this.triggerTimeout();
|
this.triggerTimeout();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.updateDirtyStatus();
|
this.updateDirtyStatus();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -562,7 +555,7 @@ Syncer.prototype.chooseNextTask = function() {
|
|||||||
isReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved;
|
isReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved;
|
||||||
if(hasChanged) {
|
if(hasChanged) {
|
||||||
if(isReadyToSave) {
|
if(isReadyToSave) {
|
||||||
return new SaveTiddlerTask(this,title);
|
return new SaveTiddlerTask(this,title);
|
||||||
} else {
|
} else {
|
||||||
havePending = true;
|
havePending = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,13 +24,13 @@ exports.isDraft = function() {
|
|||||||
return this.hasField("draft.of");
|
return this.hasField("draft.of");
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.getFieldString = function(field) {
|
exports.getFieldString = function(field,defaultValue) {
|
||||||
var value = this.fields[field];
|
var value = this.fields[field];
|
||||||
// Check for a missing field
|
// Check for a missing field
|
||||||
if(value === undefined || value === null) {
|
if(value === undefined || value === null) {
|
||||||
return "";
|
return defaultValue || "";
|
||||||
}
|
}
|
||||||
// Parse the field with the associated module (if any)
|
// Stringify the field with the associated tiddler field module (if any)
|
||||||
var fieldModule = $tw.Tiddler.fieldModules[field];
|
var fieldModule = $tw.Tiddler.fieldModules[field];
|
||||||
if(fieldModule && fieldModule.stringify) {
|
if(fieldModule && fieldModule.stringify) {
|
||||||
return fieldModule.stringify.call(this,value);
|
return fieldModule.stringify.call(this,value);
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ exports.extractEncryptedStoreArea = function(text) {
|
|||||||
if(encryptedStoreAreaStart !== -1) {
|
if(encryptedStoreAreaStart !== -1) {
|
||||||
var encryptedStoreAreaEnd = text.indexOf("</pre>",encryptedStoreAreaStart);
|
var encryptedStoreAreaEnd = text.indexOf("</pre>",encryptedStoreAreaStart);
|
||||||
if(encryptedStoreAreaEnd !== -1) {
|
if(encryptedStoreAreaEnd !== -1) {
|
||||||
return $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd-1));
|
return $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ Browser data transfer utilities, used with the clipboard and drag and drop
|
|||||||
Options:
|
Options:
|
||||||
|
|
||||||
domNode: dom node to make draggable
|
domNode: dom node to make draggable
|
||||||
dragImageType: "pill" or "dom"
|
dragImageType: "pill", "blank" or "dom" (the default)
|
||||||
dragTiddlerFn: optional function to retrieve the title of tiddler to drag
|
dragTiddlerFn: optional function to retrieve the title of tiddler to drag
|
||||||
dragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag
|
dragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag
|
||||||
widget: widget to use as the contect for the filter
|
widget: widget to use as the contect for the filter
|
||||||
@@ -73,6 +73,9 @@ exports.makeDraggable = function(options) {
|
|||||||
if(dataTransfer.setDragImage) {
|
if(dataTransfer.setDragImage) {
|
||||||
if(dragImageType === "pill") {
|
if(dragImageType === "pill") {
|
||||||
dataTransfer.setDragImage(dragImage.firstChild,-16,-16);
|
dataTransfer.setDragImage(dragImage.firstChild,-16,-16);
|
||||||
|
} else if (dragImageType === "blank") {
|
||||||
|
dragImage.removeChild(dragImage.firstChild);
|
||||||
|
dataTransfer.setDragImage(dragImage,0,0);
|
||||||
} else {
|
} else {
|
||||||
var r = domNode.getBoundingClientRect();
|
var r = domNode.getBoundingClientRect();
|
||||||
dataTransfer.setDragImage(domNode,event.clientX-r.left,event.clientY-r.top);
|
dataTransfer.setDragImage(domNode,event.clientX-r.left,event.clientY-r.top);
|
||||||
@@ -164,7 +167,7 @@ var importDataTypes = [
|
|||||||
}},
|
}},
|
||||||
{type: "URL", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
{type: "URL", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
||||||
// Check for tiddler data URI
|
// Check for tiddler data URI
|
||||||
var match = decodeURIComponent(data).match(/^data\:text\/vnd\.tiddler,(.*)/i);
|
var match = $tw.utils.decodeURIComponentSafe(data).match(/^data\:text\/vnd\.tiddler,(.*)/i);
|
||||||
if(match) {
|
if(match) {
|
||||||
return parseJSONTiddlers(match[1],fallbackTitle);
|
return parseJSONTiddlers(match[1],fallbackTitle);
|
||||||
} else {
|
} else {
|
||||||
@@ -173,7 +176,7 @@ var importDataTypes = [
|
|||||||
}},
|
}},
|
||||||
{type: "text/x-moz-url", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
{type: "text/x-moz-url", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {
|
||||||
// Check for tiddler data URI
|
// Check for tiddler data URI
|
||||||
var match = decodeURIComponent(data).match(/^data\:text\/vnd\.tiddler,(.*)/i);
|
var match = $tw.utils.decodeURIComponentSafe(data).match(/^data\:text\/vnd\.tiddler,(.*)/i);
|
||||||
if(match) {
|
if(match) {
|
||||||
return parseJSONTiddlers(match[1],fallbackTitle);
|
return parseJSONTiddlers(match[1],fallbackTitle);
|
||||||
} else {
|
} else {
|
||||||
@@ -205,10 +208,10 @@ function parseJSONTiddlers(json,fallbackTitle) {
|
|||||||
return data;
|
return data;
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.dragEventContainsFiles = function(event) {
|
function dragEventContainsType(event,targetType) {
|
||||||
if(event.dataTransfer.types) {
|
if(event.dataTransfer.types) {
|
||||||
for(var i=0; i<event.dataTransfer.types.length; i++) {
|
for(var i=0; i<event.dataTransfer.types.length; i++) {
|
||||||
if(event.dataTransfer.types[i] === "Files") {
|
if(event.dataTransfer.types[i] === targetType) {
|
||||||
return true;
|
return true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -217,4 +220,10 @@ exports.dragEventContainsFiles = function(event) {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
exports.dragEventContainsFiles = function(event) {
|
||||||
|
return (dragEventContainsType(event,"Files") && !dragEventContainsType(event,"text/plain"));
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.dragEventContainsType = dragEventContainsType;
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -34,6 +34,23 @@ exports.httpRequest = function(options) {
|
|||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
getHeader = function(targetHeader) {
|
||||||
|
return headers[targetHeader] || headers[targetHeader.toLowerCase()];
|
||||||
|
},
|
||||||
|
isSimpleRequest = function(type,headers) {
|
||||||
|
if(["GET","HEAD","POST"].indexOf(type) === -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for(var header in headers) {
|
||||||
|
if(["accept","accept-language","content-language","content-type"].indexOf(header.toLowerCase()) === -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(hasHeader("Content-Type") && ["application/x-www-form-urlencoded","multipart/form-data","text/plain"].indexOf(getHeader["Content-Type"]) === -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
returnProp = options.returnProp || "responseText",
|
returnProp = options.returnProp || "responseText",
|
||||||
request = new XMLHttpRequest(),
|
request = new XMLHttpRequest(),
|
||||||
data = "",
|
data = "",
|
||||||
@@ -76,7 +93,7 @@ exports.httpRequest = function(options) {
|
|||||||
if(data && !hasHeader("Content-Type")) {
|
if(data && !hasHeader("Content-Type")) {
|
||||||
request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
|
request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
|
||||||
}
|
}
|
||||||
if(!hasHeader("X-Requested-With")) {
|
if(!hasHeader("X-Requested-With") && !isSimpleRequest(type,headers)) {
|
||||||
request.setRequestHeader("X-Requested-With","TiddlyWiki");
|
request.setRequestHeader("X-Requested-With","TiddlyWiki");
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -49,10 +49,14 @@ Handle an event
|
|||||||
*/
|
*/
|
||||||
PageScroller.prototype.handleEvent = function(event) {
|
PageScroller.prototype.handleEvent = function(event) {
|
||||||
if(event.type === "tm-scroll") {
|
if(event.type === "tm-scroll") {
|
||||||
|
var options = {};
|
||||||
|
if($tw.utils.hop(event.paramObject,"animationDuration")) {
|
||||||
|
options.animationDuration = event.paramObject.animationDuration;
|
||||||
|
}
|
||||||
if(event.paramObject && event.paramObject.selector) {
|
if(event.paramObject && event.paramObject.selector) {
|
||||||
this.scrollSelectorIntoView(null,event.paramObject.selector);
|
this.scrollSelectorIntoView(null,event.paramObject.selector,null,options);
|
||||||
} else {
|
} else {
|
||||||
this.scrollIntoView(event.target);
|
this.scrollIntoView(event.target,null,options);
|
||||||
}
|
}
|
||||||
return false; // Event was handled
|
return false; // Event was handled
|
||||||
}
|
}
|
||||||
@@ -62,10 +66,10 @@ PageScroller.prototype.handleEvent = function(event) {
|
|||||||
/*
|
/*
|
||||||
Handle a scroll event hitting the page document
|
Handle a scroll event hitting the page document
|
||||||
*/
|
*/
|
||||||
PageScroller.prototype.scrollIntoView = function(element,callback) {
|
PageScroller.prototype.scrollIntoView = function(element,callback,options) {
|
||||||
var self = this,
|
var self = this,
|
||||||
duration = $tw.utils.getAnimationDuration(),
|
duration = $tw.utils.hop(options,"animationDuration") ? parseInt(options.animationDuration) : $tw.utils.getAnimationDuration(),
|
||||||
srcWindow = element ? element.ownerDocument.defaultView : window;
|
srcWindow = element ? element.ownerDocument.defaultView : window;
|
||||||
// Now get ready to scroll the body
|
// Now get ready to scroll the body
|
||||||
this.cancelScroll(srcWindow);
|
this.cancelScroll(srcWindow);
|
||||||
this.startTime = Date.now();
|
this.startTime = Date.now();
|
||||||
@@ -122,11 +126,11 @@ PageScroller.prototype.scrollIntoView = function(element,callback) {
|
|||||||
drawFrame();
|
drawFrame();
|
||||||
};
|
};
|
||||||
|
|
||||||
PageScroller.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) {
|
PageScroller.prototype.scrollSelectorIntoView = function(baseElement,selector,callback,options) {
|
||||||
baseElement = baseElement || document.body;
|
baseElement = baseElement || document.body;
|
||||||
var element = baseElement.querySelector(selector);
|
var element = baseElement.querySelector(selector);
|
||||||
if(element) {
|
if(element) {
|
||||||
this.scrollIntoView(element,callback);
|
this.scrollIntoView(element,callback,options);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -235,7 +235,7 @@ Object.defineProperty(TW_Element.prototype, "innerHTML", {
|
|||||||
if(node instanceof TW_Element) {
|
if(node instanceof TW_Element) {
|
||||||
b.push(node.outerHTML);
|
b.push(node.outerHTML);
|
||||||
} else if(node instanceof TW_TextNode) {
|
} else if(node instanceof TW_TextNode) {
|
||||||
b.push($tw.utils.htmlEncode(node.textContent));
|
b.push($tw.utils.htmlTextEncode(node.textContent));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return b.join("");
|
return b.join("");
|
||||||
|
|||||||
@@ -95,6 +95,15 @@ LinkedList.prototype.toArray = function() {
|
|||||||
return output;
|
return output;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
LinkedList.prototype.makeTiddlerIterator = function(wiki) {
|
||||||
|
var self = this;
|
||||||
|
return function(callback) {
|
||||||
|
self.each(function(title) {
|
||||||
|
callback(wiki.getTiddler(title),title);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
function _removeOne(list,value) {
|
function _removeOne(list,value) {
|
||||||
var prevEntry = list.prev[value],
|
var prevEntry = list.prev[value],
|
||||||
nextEntry = list.next[value],
|
nextEntry = list.next[value],
|
||||||
|
|||||||
@@ -199,6 +199,8 @@ exports.transliterationPairs = {
|
|||||||
"Nj":"N",
|
"Nj":"N",
|
||||||
"Ñ":"N",
|
"Ñ":"N",
|
||||||
"NJ":"NJ",
|
"NJ":"NJ",
|
||||||
|
"ð":"d",
|
||||||
|
"Ð":"D",
|
||||||
"Ó":"O",
|
"Ó":"O",
|
||||||
"Ŏ":"O",
|
"Ŏ":"O",
|
||||||
"Ǒ":"O",
|
"Ǒ":"O",
|
||||||
@@ -265,6 +267,8 @@ exports.transliterationPairs = {
|
|||||||
"Ɽ":"R",
|
"Ɽ":"R",
|
||||||
"Ꜿ":"C",
|
"Ꜿ":"C",
|
||||||
"Ǝ":"E",
|
"Ǝ":"E",
|
||||||
|
"ß":"ss",
|
||||||
|
"ẞ":"SS",
|
||||||
"Ś":"S",
|
"Ś":"S",
|
||||||
"Ṥ":"S",
|
"Ṥ":"S",
|
||||||
"Š":"S",
|
"Š":"S",
|
||||||
@@ -275,6 +279,8 @@ exports.transliterationPairs = {
|
|||||||
"Ṡ":"S",
|
"Ṡ":"S",
|
||||||
"Ṣ":"S",
|
"Ṣ":"S",
|
||||||
"Ṩ":"S",
|
"Ṩ":"S",
|
||||||
|
"þ": "th",
|
||||||
|
"Þ": "TH",
|
||||||
"Ť":"T",
|
"Ť":"T",
|
||||||
"Ţ":"T",
|
"Ţ":"T",
|
||||||
"Ṱ":"T",
|
"Ṱ":"T",
|
||||||
@@ -907,7 +913,8 @@ exports.transliterationPairs = {
|
|||||||
"т":"t",
|
"т":"t",
|
||||||
"ь":"'",
|
"ь":"'",
|
||||||
"б":"b",
|
"б":"b",
|
||||||
"ю":"yu"
|
"ю":"yu",
|
||||||
|
"…":"..."
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.transliterate = function(str) {
|
exports.transliterate = function(str) {
|
||||||
|
|||||||
@@ -383,6 +383,15 @@ exports.formatDateString = function(date,template) {
|
|||||||
[/^0WW/, function() {
|
[/^0WW/, function() {
|
||||||
return $tw.utils.pad($tw.utils.getWeek(date));
|
return $tw.utils.pad($tw.utils.getWeek(date));
|
||||||
}],
|
}],
|
||||||
|
[/^0ddddd/, function() {
|
||||||
|
return $tw.utils.pad(Math.floor((date - new Date(date.getFullYear(), 0, 0)) / 1000 / 60 / 60 / 24),3);
|
||||||
|
}],
|
||||||
|
[/^ddddd/, function() {
|
||||||
|
return Math.floor((date - new Date(date.getFullYear(), 0, 0)) / 1000 / 60 / 60 / 24);
|
||||||
|
}],
|
||||||
|
[/^dddd/, function() {
|
||||||
|
return [7,1,2,3,4,5,6][date.getDay()];
|
||||||
|
}],
|
||||||
[/^ddd/, function() {
|
[/^ddd/, function() {
|
||||||
return $tw.language.getString("Date/Short/Day/" + date.getDay());
|
return $tw.language.getString("Date/Short/Day/" + date.getDay());
|
||||||
}],
|
}],
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ Invoke the action associated with this widget
|
|||||||
ConfirmWidget.prototype.invokeAction = function(triggeringWidget,event) {
|
ConfirmWidget.prototype.invokeAction = function(triggeringWidget,event) {
|
||||||
var invokeActions = true,
|
var invokeActions = true,
|
||||||
handled = true,
|
handled = true,
|
||||||
win = event.event && event.event.view ? event.event.view : window;
|
win = event && event.event && event.event.view ? event.event.view : window;
|
||||||
if(this.prompt) {
|
if(this.prompt) {
|
||||||
invokeActions = win.confirm(this.message);
|
invokeActions = win.confirm(this.message);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ SendMessageWidget.prototype.execute = function() {
|
|||||||
this.actionParam = this.getAttribute("$param");
|
this.actionParam = this.getAttribute("$param");
|
||||||
this.actionName = this.getAttribute("$name");
|
this.actionName = this.getAttribute("$name");
|
||||||
this.actionValue = this.getAttribute("$value","");
|
this.actionValue = this.getAttribute("$value","");
|
||||||
|
this.actionNames = this.getAttribute("$names");
|
||||||
|
this.actionValues = this.getAttribute("$values");
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -59,13 +61,20 @@ Invoke the action associated with this widget
|
|||||||
SendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {
|
SendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {
|
||||||
// Get the string parameter
|
// Get the string parameter
|
||||||
var param = this.actionParam;
|
var param = this.actionParam;
|
||||||
// Assemble the attributes as a hashmap
|
// Assemble the parameters as a hashmap
|
||||||
var paramObject = Object.create(null);
|
var paramObject = Object.create(null);
|
||||||
var count = 0;
|
// Add names/values pairs if present
|
||||||
|
if(this.actionNames && this.actionValues) {
|
||||||
|
var names = this.wiki.filterTiddlers(this.actionNames,this),
|
||||||
|
values = this.wiki.filterTiddlers(this.actionValues,this);
|
||||||
|
$tw.utils.each(names,function(name,index) {
|
||||||
|
paramObject[name] = values[index] || "";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// Add raw parameters
|
||||||
$tw.utils.each(this.attributes,function(attribute,name) {
|
$tw.utils.each(this.attributes,function(attribute,name) {
|
||||||
if(name.charAt(0) !== "$") {
|
if(name.charAt(0) !== "$") {
|
||||||
paramObject[name] = attribute;
|
paramObject[name] = attribute;
|
||||||
count++;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// Add name/value pair if present
|
// Add name/value pair if present
|
||||||
@@ -73,14 +82,15 @@ SendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {
|
|||||||
paramObject[this.actionName] = this.actionValue;
|
paramObject[this.actionName] = this.actionValue;
|
||||||
}
|
}
|
||||||
// Dispatch the message
|
// Dispatch the message
|
||||||
this.dispatchEvent({
|
var params = {
|
||||||
type: this.actionMessage,
|
type: this.actionMessage,
|
||||||
param: param,
|
param: param,
|
||||||
paramObject: paramObject,
|
paramObject: paramObject,
|
||||||
|
event: event,
|
||||||
tiddlerTitle: this.getVariable("currentTiddler"),
|
tiddlerTitle: this.getVariable("currentTiddler"),
|
||||||
navigateFromTitle: this.getVariable("storyTiddler"),
|
navigateFromTitle: this.getVariable("storyTiddler")
|
||||||
event: event
|
};
|
||||||
});
|
this.dispatchEvent(params);
|
||||||
return true; // Action was invoked
|
return true; // Action was invoked
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
86
core/modules/widgets/action-setmultiplefields.js
Normal file
86
core/modules/widgets/action-setmultiplefields.js
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/core/modules/widgets/action-setmultiplefields.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: widget
|
||||||
|
|
||||||
|
Action widget to set multiple fields or indexes on a tiddler
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var Widget = require("$:/core/modules/widgets/widget.js").widget;
|
||||||
|
|
||||||
|
var SetMultipleFieldsWidget = function(parseTreeNode,options) {
|
||||||
|
this.initialise(parseTreeNode,options);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Inherit from the base widget class
|
||||||
|
*/
|
||||||
|
SetMultipleFieldsWidget.prototype = new Widget();
|
||||||
|
|
||||||
|
/*
|
||||||
|
Render this widget into the DOM
|
||||||
|
*/
|
||||||
|
SetMultipleFieldsWidget.prototype.render = function(parent,nextSibling) {
|
||||||
|
this.computeAttributes();
|
||||||
|
this.execute();
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Compute the internal state of the widget
|
||||||
|
*/
|
||||||
|
SetMultipleFieldsWidget.prototype.execute = function() {
|
||||||
|
this.actionTiddler = this.getAttribute("$tiddler",this.getVariable("currentTiddler"));
|
||||||
|
this.actionFields = this.getAttribute("$fields");
|
||||||
|
this.actionIndexes = this.getAttribute("$indexes");
|
||||||
|
this.actionValues = this.getAttribute("$values");
|
||||||
|
this.actionTimestamp = this.getAttribute("$timestamp","yes") === "yes";
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Refresh the widget by ensuring our attributes are up to date
|
||||||
|
*/
|
||||||
|
SetMultipleFieldsWidget.prototype.refresh = function(changedTiddlers) {
|
||||||
|
var changedAttributes = this.computeAttributes();
|
||||||
|
if(changedAttributes["$tiddler"] || changedAttributes["$fields"] || changedAttributes["$indexes"] || changedAttributes["$values"] || changedAttributes["$timestamp"]) {
|
||||||
|
this.refreshSelf();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return this.refreshChildren(changedTiddlers);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Invoke the action associated with this widget
|
||||||
|
*/
|
||||||
|
SetMultipleFieldsWidget.prototype.invokeAction = function(triggeringWidget,event) {
|
||||||
|
var tiddler = this.wiki.getTiddler(this.actionTiddler),
|
||||||
|
names, values = this.wiki.filterTiddlers(this.actionValues,this);
|
||||||
|
if(this.actionFields) {
|
||||||
|
var additions = {};
|
||||||
|
names = this.wiki.filterTiddlers(this.actionFields,this);
|
||||||
|
$tw.utils.each(names,function(fieldname,index) {
|
||||||
|
additions[fieldname] = values[index] || "";
|
||||||
|
});
|
||||||
|
var creationFields = this.actionTimestamp ? this.wiki.getCreationFields() : undefined,
|
||||||
|
modificationFields = this.actionTimestamp ? this.wiki.getModificationFields() : undefined;
|
||||||
|
this.wiki.addTiddler(new $tw.Tiddler(creationFields,tiddler,{title: this.actionTiddler},modificationFields,additions));
|
||||||
|
} else if(this.actionIndexes) {
|
||||||
|
var data = this.wiki.getTiddlerData(this.actionTiddler,Object.create(null));
|
||||||
|
names = this.wiki.filterTiddlers(this.actionIndexes,this);
|
||||||
|
$tw.utils.each(names,function(name,index) {
|
||||||
|
data[name] = values[index] || "";
|
||||||
|
});
|
||||||
|
this.wiki.setTiddlerData(this.actionTiddler,data,{},{suppressTimestamp: !this.actionTimestamp});
|
||||||
|
}
|
||||||
|
return true; // Action was invoked
|
||||||
|
};
|
||||||
|
|
||||||
|
exports["action-setmultiplefields"] = SetMultipleFieldsWidget;
|
||||||
|
|
||||||
|
})();
|
||||||
|
|
||||||
@@ -52,7 +52,13 @@ CodeBlockWidget.prototype.execute = function() {
|
|||||||
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
|
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
|
||||||
*/
|
*/
|
||||||
CodeBlockWidget.prototype.refresh = function(changedTiddlers) {
|
CodeBlockWidget.prototype.refresh = function(changedTiddlers) {
|
||||||
return false;
|
var changedAttributes = this.computeAttributes();
|
||||||
|
if(changedAttributes.code || changedAttributes.language) {
|
||||||
|
this.refreshSelf();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.codeblock = CodeBlockWidget;
|
exports.codeblock = CodeBlockWidget;
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ DraggableWidget.prototype.render = function(parent,nextSibling) {
|
|||||||
dragFilterFn: function() {return self.getAttribute("filter");},
|
dragFilterFn: function() {return self.getAttribute("filter");},
|
||||||
startActions: self.startActions,
|
startActions: self.startActions,
|
||||||
endActions: self.endActions,
|
endActions: self.endActions,
|
||||||
|
dragImageType: self.dragImageType,
|
||||||
widget: this
|
widget: this
|
||||||
});
|
});
|
||||||
// Insert the link into the DOM and render any children
|
// Insert the link into the DOM and render any children
|
||||||
@@ -71,6 +72,7 @@ DraggableWidget.prototype.execute = function() {
|
|||||||
this.draggableClasses = this.getAttribute("class");
|
this.draggableClasses = this.getAttribute("class");
|
||||||
this.startActions = this.getAttribute("startactions");
|
this.startActions = this.getAttribute("startactions");
|
||||||
this.endActions = this.getAttribute("endactions");
|
this.endActions = this.getAttribute("endactions");
|
||||||
|
this.dragImageType = this.getAttribute("dragimagetype");
|
||||||
// Make the child widgets
|
// Make the child widgets
|
||||||
this.makeChildWidgets();
|
this.makeChildWidgets();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -198,7 +198,8 @@ DropZoneWidget.prototype.handleDropEvent = function(event) {
|
|||||||
this.resetState();
|
this.resetState();
|
||||||
// Import any files in the drop
|
// Import any files in the drop
|
||||||
var numFiles = 0;
|
var numFiles = 0;
|
||||||
if(dataTransfer.files) {
|
// If we have type text/vnd.tiddlywiki then skip trying to import files
|
||||||
|
if(dataTransfer.files && !$tw.utils.dragEventContainsType(event,"text/vnd.tiddler")) {
|
||||||
numFiles = this.wiki.readFiles(dataTransfer.files,{
|
numFiles = this.wiki.readFiles(dataTransfer.files,{
|
||||||
callback: readFileCallback,
|
callback: readFileCallback,
|
||||||
deserializer: this.dropzoneDeserializer
|
deserializer: this.dropzoneDeserializer
|
||||||
|
|||||||
@@ -76,16 +76,22 @@ EventWidget.prototype.render = function(parent,nextSibling) {
|
|||||||
variables["tv-selectednode-posy"] = selectedNode.offsetTop.toString();
|
variables["tv-selectednode-posy"] = selectedNode.offsetTop.toString();
|
||||||
variables["tv-selectednode-width"] = selectedNode.offsetWidth.toString();
|
variables["tv-selectednode-width"] = selectedNode.offsetWidth.toString();
|
||||||
variables["tv-selectednode-height"] = selectedNode.offsetHeight.toString();
|
variables["tv-selectednode-height"] = selectedNode.offsetHeight.toString();
|
||||||
|
|
||||||
|
if(event.clientX && event.clientY) {
|
||||||
|
//Add variables for event X and Y position relative to selected node
|
||||||
|
selectedNodeRect = selectedNode.getBoundingClientRect();
|
||||||
|
variables["event-fromselected-posx"] = (event.clientX - selectedNodeRect.left).toString();
|
||||||
|
variables["event-fromselected-posy"] = (event.clientY - selectedNodeRect.top).toString();
|
||||||
|
|
||||||
//Add variables for event X and Y position relative to selected node
|
//Add variables for event X and Y position relative to event catcher node
|
||||||
selectedNodeRect = selectedNode.getBoundingClientRect();
|
catcherNodeRect = self.domNode.getBoundingClientRect();
|
||||||
variables["event-fromselected-posx"] = (event.clientX - selectedNodeRect.left).toString();
|
variables["event-fromcatcher-posx"] = (event.clientX - catcherNodeRect.left).toString();
|
||||||
variables["event-fromselected-posy"] = (event.clientY - selectedNodeRect.top).toString();
|
variables["event-fromcatcher-posy"] = (event.clientY - catcherNodeRect.top).toString();
|
||||||
|
|
||||||
//Add variables for event X and Y position relative to event catcher node
|
//Add variables for event X and Y position relative to the viewport
|
||||||
catcherNodeRect = self.domNode.getBoundingClientRect();
|
variables["event-fromviewport-posx"] = event.clientX.toString();
|
||||||
variables["event-fromcatcher-posx"] = (event.clientX - catcherNodeRect.left).toString();
|
variables["event-fromviewport-posy"] = event.clientY.toString();
|
||||||
variables["event-fromcatcher-posy"] = (event.clientY - catcherNodeRect.top).toString();
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -111,6 +111,16 @@ ImageWidget.prototype.render = function(parent,nextSibling) {
|
|||||||
if(this.imageAlt) {
|
if(this.imageAlt) {
|
||||||
domNode.setAttribute("alt",this.imageAlt);
|
domNode.setAttribute("alt",this.imageAlt);
|
||||||
}
|
}
|
||||||
|
// Add classes when the image loads or fails
|
||||||
|
$tw.utils.addClass(domNode,"tc-image-loading");
|
||||||
|
domNode.addEventListener("load",function() {
|
||||||
|
$tw.utils.removeClass(domNode,"tc-image-loading");
|
||||||
|
$tw.utils.addClass(domNode,"tc-image-loaded");
|
||||||
|
},false);
|
||||||
|
domNode.addEventListener("error",function() {
|
||||||
|
$tw.utils.removeClass(domNode,"tc-image-loading");
|
||||||
|
$tw.utils.addClass(domNode,"tc-image-error");
|
||||||
|
},false);
|
||||||
// Insert element
|
// Insert element
|
||||||
parent.insertBefore(domNode,nextSibling);
|
parent.insertBefore(domNode,nextSibling);
|
||||||
this.domNodes.push(domNode);
|
this.domNodes.push(domNode);
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ ImportVariablesWidget.prototype.execute = function(tiddlerList) {
|
|||||||
this.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);
|
this.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);
|
||||||
// Accumulate the <$set> widgets from each tiddler
|
// Accumulate the <$set> widgets from each tiddler
|
||||||
$tw.utils.each(this.tiddlerList,function(title) {
|
$tw.utils.each(this.tiddlerList,function(title) {
|
||||||
var parser = widgetPointer.wiki.parseTiddler(title);
|
var parser = widgetPointer.wiki.parseTiddler(title,{parseAsInline:true});
|
||||||
if(parser) {
|
if(parser) {
|
||||||
var parseTreeNode = parser.tree[0];
|
var parseTreeNode = parser.tree[0];
|
||||||
while(parseTreeNode && parseTreeNode.type === "set") {
|
while(parseTreeNode && parseTreeNode.type === "set") {
|
||||||
|
|||||||
@@ -32,13 +32,7 @@ JSONTiddlerWidget.prototype.render = function(parent,nextSibling) {
|
|||||||
this.computeAttributes();
|
this.computeAttributes();
|
||||||
this.execute();
|
this.execute();
|
||||||
// Collect the fields from the optional base tiddler
|
// Collect the fields from the optional base tiddler
|
||||||
var fields = {};
|
var fields = this.getTiddlerFields();
|
||||||
if(this.attTiddler) {
|
|
||||||
var tiddler = this.wiki.getTiddler(this.attTiddler);
|
|
||||||
if(tiddler) {
|
|
||||||
fields = tiddler.getFieldStrings({exclude: this.attExclude.split(" ")});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Add custom fields specified in attributes starting with $
|
// Add custom fields specified in attributes starting with $
|
||||||
$tw.utils.each(this.attributes,function(attribute,name) {
|
$tw.utils.each(this.attributes,function(attribute,name) {
|
||||||
if(name.charAt(0) === "$") {
|
if(name.charAt(0) === "$") {
|
||||||
@@ -79,6 +73,19 @@ JSONTiddlerWidget.prototype.refresh = function(changedTiddlers) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
JSONTiddlerWidget.prototype.getTiddlerFields = function() {
|
||||||
|
var fields = {};
|
||||||
|
if(this.attTiddler) {
|
||||||
|
var tiddler = this.wiki.getTiddler(this.attTiddler);
|
||||||
|
if(tiddler) {
|
||||||
|
fields = tiddler.getFieldStrings({exclude: this.attExclude.split(" ")});
|
||||||
|
} else {
|
||||||
|
fields = {title: this.attTiddler};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fields;
|
||||||
|
};
|
||||||
|
|
||||||
exports.jsontiddler = JSONTiddlerWidget;
|
exports.jsontiddler = JSONTiddlerWidget;
|
||||||
|
|
||||||
})();
|
})();
|
||||||
96
core/modules/widgets/let.js
Normal file
96
core/modules/widgets/let.js
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/core/modules/widgets/let.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: widget
|
||||||
|
|
||||||
|
This widget allows defining multiple variables at once, while allowing
|
||||||
|
the later variables to depend upon the earlier ones.
|
||||||
|
|
||||||
|
```
|
||||||
|
\define helloworld() Hello world!
|
||||||
|
<$let currentTiddler="target" value={{!!value}} currentTiddler="different">
|
||||||
|
{{!!value}} will be different from <<value>>
|
||||||
|
</$let>
|
||||||
|
```
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var Widget = require("$:/core/modules/widgets/widget.js").widget;
|
||||||
|
|
||||||
|
var LetWidget = function(parseTreeNode,options) {
|
||||||
|
// Initialise
|
||||||
|
this.initialise(parseTreeNode,options);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Inherit from the base widget class
|
||||||
|
*/
|
||||||
|
LetWidget.prototype = new Widget();
|
||||||
|
|
||||||
|
/*
|
||||||
|
Render this widget into the DOM
|
||||||
|
*/
|
||||||
|
LetWidget.prototype.render = function(parent,nextSibling) {
|
||||||
|
this.parentDomNode = parent;
|
||||||
|
this.computeAttributes();
|
||||||
|
this.execute();
|
||||||
|
this.renderChildren(parent,nextSibling);
|
||||||
|
};
|
||||||
|
|
||||||
|
LetWidget.prototype.computeAttributes = function() {
|
||||||
|
// Before computing attributes, we must make clear that none of the
|
||||||
|
// existing attributes are staged for lookup, even on a refresh
|
||||||
|
var changedAttributes = {},
|
||||||
|
self = this;
|
||||||
|
this.currentValueFor = Object.create(null);
|
||||||
|
$tw.utils.each(this.parseTreeNode.orderedAttributes,function(attribute,index) {
|
||||||
|
var value = self.computeAttribute(attribute),
|
||||||
|
name = attribute.name;
|
||||||
|
if(name.charAt(0) !== "$") {
|
||||||
|
// Now that it's prepped, we're allowed to look this variable up
|
||||||
|
// when defining later variables
|
||||||
|
self.currentValueFor[name] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Run through again, setting variables and looking for differences
|
||||||
|
$tw.utils.each(this.currentValueFor,function(value,name) {
|
||||||
|
if (self.attributes[name] !== value) {
|
||||||
|
self.attributes[name] = value;
|
||||||
|
self.setVariable(name,value);
|
||||||
|
changedAttributes[name] = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return changedAttributes;
|
||||||
|
};
|
||||||
|
|
||||||
|
LetWidget.prototype.getVariableInfo = function(name,options) {
|
||||||
|
// Special handling: If this variable exists in this very $let, we can
|
||||||
|
// use it, but only if it's been staged.
|
||||||
|
if ($tw.utils.hop(this.currentValueFor,name)) {
|
||||||
|
return {
|
||||||
|
text: this.currentValueFor[name]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return Widget.prototype.getVariableInfo.call(this,name,options);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Refresh the widget by ensuring our attributes are up to date
|
||||||
|
*/
|
||||||
|
LetWidget.prototype.refresh = function(changedTiddlers) {
|
||||||
|
var changedAttributes = this.computeAttributes();
|
||||||
|
if($tw.utils.count(changedAttributes) > 0) {
|
||||||
|
this.refreshSelf();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return this.refreshChildren(changedTiddlers);
|
||||||
|
};
|
||||||
|
|
||||||
|
exports["let"] = LetWidget;
|
||||||
|
|
||||||
|
})();
|
||||||
@@ -207,7 +207,8 @@ Selectively refreshes the widget if needed. Returns true if the widget or any of
|
|||||||
*/
|
*/
|
||||||
LinkWidget.prototype.refresh = function(changedTiddlers) {
|
LinkWidget.prototype.refresh = function(changedTiddlers) {
|
||||||
var changedAttributes = this.computeAttributes();
|
var changedAttributes = this.computeAttributes();
|
||||||
if(changedAttributes.to || changedTiddlers[this.to] || changedAttributes["aria-label"] || changedAttributes.tooltip) {
|
if(changedAttributes.to || changedTiddlers[this.to] || changedAttributes["aria-label"] || changedAttributes.tooltip ||
|
||||||
|
changedAttributes["class"] || changedAttributes.tabindex || changedAttributes.draggable || changedAttributes.tag) {
|
||||||
this.refreshSelf();
|
this.refreshSelf();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,6 +51,9 @@ ListWidget.prototype.render = function(parent,nextSibling) {
|
|||||||
} else {
|
} else {
|
||||||
this.storyview = null;
|
this.storyview = null;
|
||||||
}
|
}
|
||||||
|
if(this.storyview && this.storyview.renderEnd) {
|
||||||
|
this.storyview.renderEnd();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -236,6 +239,11 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) {
|
|||||||
hasRefreshed = hasRefreshed || refreshed;
|
hasRefreshed = hasRefreshed || refreshed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// If there are items to remove and we have not refreshed then recreate the item that will now be at the last position
|
||||||
|
if(!hasRefreshed && this.children.length > this.list.length) {
|
||||||
|
this.removeListItem(this.list.length-1);
|
||||||
|
this.insertListItem(this.list.length-1,this.list[this.list.length-1]);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Cycle through the list, inserting and removing list items as needed
|
// Cycle through the list, inserting and removing list items as needed
|
||||||
for(t=0; t<this.list.length; t++) {
|
for(t=0; t<this.list.length; t++) {
|
||||||
|
|||||||
@@ -36,28 +36,38 @@ MessageCatcherWidget.prototype.render = function(parent,nextSibling) {
|
|||||||
// Helper to add an event handler
|
// Helper to add an event handler
|
||||||
var addEventHandler = function(type,actions) {
|
var addEventHandler = function(type,actions) {
|
||||||
if(type && actions) {
|
if(type && actions) {
|
||||||
|
var isActionStringExecuting = false;
|
||||||
self.addEventListener(
|
self.addEventListener(
|
||||||
type,
|
type,
|
||||||
function(event) {
|
function(event) {
|
||||||
|
// Don't trap the event if it came from one of our action handlers
|
||||||
|
if(isActionStringExecuting) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
// Collect all the event properties into variables
|
// Collect all the event properties into variables
|
||||||
var collectProps = function(obj,prefix) {
|
var collectProps = function(obj,prefix) {
|
||||||
prefix = prefix || "";
|
prefix = prefix || "";
|
||||||
var props = {};
|
var props = {},
|
||||||
|
names = [];
|
||||||
$tw.utils.each(obj,function(value,name) {
|
$tw.utils.each(obj,function(value,name) {
|
||||||
if(["string","boolean","number"].indexOf(typeof value) !== -1) {
|
if(["string","boolean","number"].indexOf(typeof value) !== -1) {
|
||||||
props[prefix + name] = value.toString();
|
names.push(name);
|
||||||
|
props[prefix + "-" + name] = value.toString();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
props["list-" + prefix] = $tw.utils.stringifyList(names);
|
||||||
return props;
|
return props;
|
||||||
};
|
};
|
||||||
var variables = $tw.utils.extend(
|
var variables = $tw.utils.extend(
|
||||||
{},
|
{},
|
||||||
collectProps(event.paramObject,"event-paramObject-"),
|
collectProps(event.paramObject,"event-paramObject"),
|
||||||
collectProps(event,"event-"),
|
collectProps(event,"event"),
|
||||||
{
|
{
|
||||||
modifier: $tw.keyboardManager.getEventModifierKeyDescriptor(event)
|
modifier: $tw.keyboardManager.getEventModifierKeyDescriptor(event)
|
||||||
});
|
});
|
||||||
|
isActionStringExecuting = true;
|
||||||
self.invokeActionString(actions,self,event,variables);
|
self.invokeActionString(actions,self,event,variables);
|
||||||
|
isActionStringExecuting = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -44,8 +44,7 @@ NavigatorWidget.prototype.render = function(parent,nextSibling) {
|
|||||||
{type: "tm-fold-tiddler", handler: "handleFoldTiddlerEvent"},
|
{type: "tm-fold-tiddler", handler: "handleFoldTiddlerEvent"},
|
||||||
{type: "tm-fold-other-tiddlers", handler: "handleFoldOtherTiddlersEvent"},
|
{type: "tm-fold-other-tiddlers", handler: "handleFoldOtherTiddlersEvent"},
|
||||||
{type: "tm-fold-all-tiddlers", handler: "handleFoldAllTiddlersEvent"},
|
{type: "tm-fold-all-tiddlers", handler: "handleFoldAllTiddlersEvent"},
|
||||||
{type: "tm-unfold-all-tiddlers", handler: "handleUnfoldAllTiddlersEvent"},
|
{type: "tm-unfold-all-tiddlers", handler: "handleUnfoldAllTiddlersEvent"}
|
||||||
{type: "tm-rename-tiddler", handler: "handleRenameTiddlerEvent"}
|
|
||||||
]);
|
]);
|
||||||
this.parentDomNode = parent;
|
this.parentDomNode = parent;
|
||||||
this.computeAttributes();
|
this.computeAttributes();
|
||||||
@@ -636,16 +635,6 @@ NavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
NavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) {
|
|
||||||
var options = {},
|
|
||||||
paramObject = event.paramObject || {},
|
|
||||||
from = paramObject.from || event.tiddlerTitle,
|
|
||||||
to = paramObject.to;
|
|
||||||
options.dontRenameInTags = (paramObject.renameInTags === "false" || paramObject.renameInTags === "no") ? true : false;
|
|
||||||
options.dontRenameInLists = (paramObject.renameInLists === "false" || paramObject.renameInLists === "no") ? true : false;
|
|
||||||
this.wiki.renameTiddler(from,to,options);
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.navigator = NavigatorWidget;
|
exports.navigator = NavigatorWidget;
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -64,9 +64,9 @@ RadioWidget.prototype.getValue = function() {
|
|||||||
tiddler = this.wiki.getTiddler(this.radioTitle);
|
tiddler = this.wiki.getTiddler(this.radioTitle);
|
||||||
if(tiddler) {
|
if(tiddler) {
|
||||||
if(this.radioIndex) {
|
if(this.radioIndex) {
|
||||||
value = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex);
|
value = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex,this.radioDefault);
|
||||||
} else {
|
} else {
|
||||||
value = tiddler.getFieldString(this.radioField);
|
value = tiddler.getFieldString(this.radioField,this.radioDefault);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
value = this.radioDefault;
|
value = this.radioDefault;
|
||||||
@@ -122,6 +122,7 @@ RadioWidget.prototype.refresh = function(changedTiddlers) {
|
|||||||
return true;
|
return true;
|
||||||
} else if(changedTiddlers[this.radioTitle]) {
|
} else if(changedTiddlers[this.radioTitle]) {
|
||||||
this.inputDomNode.checked = this.getValue() === this.radioValue;
|
this.inputDomNode.checked = this.getValue() === this.radioValue;
|
||||||
|
$tw.utils.toggleClass(this.labelDomNode,"tc-radio-selected",this.inputDomNode.checked);
|
||||||
return this.refreshChildren(changedTiddlers);
|
return this.refreshChildren(changedTiddlers);
|
||||||
} else {
|
} else {
|
||||||
return this.refreshChildren(changedTiddlers);
|
return this.refreshChildren(changedTiddlers);
|
||||||
|
|||||||
@@ -226,7 +226,7 @@ RevealWidget.prototype.refresh = function(changedTiddlers) {
|
|||||||
this.refreshSelf();
|
this.refreshSelf();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if(this.type === "popup" && this.updatePopupPosition && (changedTiddlers[this.state] || changedTiddlers[this.stateTitle])) {
|
} else if(this.type === "popup" && this.isOpen && this.updatePopupPosition && (changedTiddlers[this.state] || changedTiddlers[this.stateTitle])) {
|
||||||
this.positionPopup(this.domNode);
|
this.positionPopup(this.domNode);
|
||||||
}
|
}
|
||||||
if(changedAttributes.style) {
|
if(changedAttributes.style) {
|
||||||
|
|||||||
@@ -38,10 +38,14 @@ ScrollableWidget.prototype.handleScrollEvent = function(event) {
|
|||||||
if(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === "yes") {
|
if(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === "yes") {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
var options = {};
|
||||||
|
if($tw.utils.hop(event.paramObject,"animationDuration")) {
|
||||||
|
options.animationDuration = event.paramObject.animationDuration;
|
||||||
|
}
|
||||||
if(event.paramObject && event.paramObject.selector) {
|
if(event.paramObject && event.paramObject.selector) {
|
||||||
this.scrollSelectorIntoView(null,event.paramObject.selector);
|
this.scrollSelectorIntoView(null,event.paramObject.selector,null,options);
|
||||||
} else {
|
} else {
|
||||||
this.scrollIntoView(event.target);
|
this.scrollIntoView(event.target,null,options);
|
||||||
}
|
}
|
||||||
return false; // Handled event
|
return false; // Handled event
|
||||||
};
|
};
|
||||||
@@ -49,9 +53,9 @@ ScrollableWidget.prototype.handleScrollEvent = function(event) {
|
|||||||
/*
|
/*
|
||||||
Scroll an element into view
|
Scroll an element into view
|
||||||
*/
|
*/
|
||||||
ScrollableWidget.prototype.scrollIntoView = function(element) {
|
ScrollableWidget.prototype.scrollIntoView = function(element,callback,options) {
|
||||||
var duration = $tw.utils.getAnimationDuration(),
|
var duration = $tw.utils.hop(options,"animationDuration") ? parseInt(options.animationDuration) : $tw.utils.getAnimationDuration(),
|
||||||
srcWindow = element ? element.ownerDocument.defaultView : window;
|
srcWindow = element ? element.ownerDocument.defaultView : window;
|
||||||
this.cancelScroll();
|
this.cancelScroll();
|
||||||
this.startTime = Date.now();
|
this.startTime = Date.now();
|
||||||
var scrollPosition = {
|
var scrollPosition = {
|
||||||
@@ -114,11 +118,11 @@ ScrollableWidget.prototype.scrollIntoView = function(element) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ScrollableWidget.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) {
|
ScrollableWidget.prototype.scrollSelectorIntoView = function(baseElement,selector,callback,options) {
|
||||||
baseElement = baseElement || document.body;
|
baseElement = baseElement || document.body;
|
||||||
var element = baseElement.querySelector(selector);
|
var element = baseElement.querySelector(selector);
|
||||||
if(element) {
|
if(element) {
|
||||||
this.scrollIntoView(element,callback);
|
this.scrollIntoView(element,callback,options);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -155,8 +159,6 @@ ScrollableWidget.prototype.render = function(parent,nextSibling) {
|
|||||||
// Create elements
|
// Create elements
|
||||||
this.outerDomNode = this.document.createElement("div");
|
this.outerDomNode = this.document.createElement("div");
|
||||||
$tw.utils.setStyle(this.outerDomNode,[
|
$tw.utils.setStyle(this.outerDomNode,[
|
||||||
{overflowY: "auto"},
|
|
||||||
{overflowX: "auto"},
|
|
||||||
{webkitOverflowScrolling: "touch"}
|
{webkitOverflowScrolling: "touch"}
|
||||||
]);
|
]);
|
||||||
this.innerDomNode = this.document.createElement("div");
|
this.innerDomNode = this.document.createElement("div");
|
||||||
|
|||||||
81
core/modules/widgets/setmultiplevariables.js
Normal file
81
core/modules/widgets/setmultiplevariables.js
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/core/modules/widgets/setmultiplevariables.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: widget
|
||||||
|
|
||||||
|
Widget to set multiple variables at once from a list of names and a list of values
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var Widget = require("$:/core/modules/widgets/widget.js").widget;
|
||||||
|
|
||||||
|
var SetMultipleVariablesWidget = function(parseTreeNode,options) {
|
||||||
|
this.initialise(parseTreeNode,options);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Inherit from the base widget class
|
||||||
|
*/
|
||||||
|
SetMultipleVariablesWidget.prototype = new Widget();
|
||||||
|
|
||||||
|
/*
|
||||||
|
Render this widget into the DOM
|
||||||
|
*/
|
||||||
|
SetMultipleVariablesWidget.prototype.render = function(parent,nextSibling) {
|
||||||
|
this.parentDomNode = parent;
|
||||||
|
this.computeAttributes();
|
||||||
|
this.execute();
|
||||||
|
this.renderChildren(parent,nextSibling);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Compute the internal state of the widget
|
||||||
|
*/
|
||||||
|
SetMultipleVariablesWidget.prototype.execute = function() {
|
||||||
|
// Setup our variables
|
||||||
|
this.setVariables();
|
||||||
|
// Construct the child widgets
|
||||||
|
this.makeChildWidgets();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
SetMultipleVariablesWidget.prototype.setVariables = function() {
|
||||||
|
// Set the variables
|
||||||
|
var self = this,
|
||||||
|
filterNames = this.getAttribute("$names",""),
|
||||||
|
filterValues = this.getAttribute("$values","");
|
||||||
|
this.variableNames = [];
|
||||||
|
this.variableValues = [];
|
||||||
|
if(filterNames && filterValues) {
|
||||||
|
this.variableNames = this.wiki.filterTiddlers(filterNames,this);
|
||||||
|
this.variableValues = this.wiki.filterTiddlers(filterValues,this);
|
||||||
|
$tw.utils.each(this.variableNames,function(varname,index) {
|
||||||
|
self.setVariable(varname,self.variableValues[index]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Refresh the widget by ensuring our attributes are up to date
|
||||||
|
*/
|
||||||
|
SetMultipleVariablesWidget.prototype.refresh = function(changedTiddlers) {
|
||||||
|
var filterNames = this.getAttribute("$names",""),
|
||||||
|
filterValues = this.getAttribute("$values",""),
|
||||||
|
variableNames = this.wiki.filterTiddlers(filterNames,this),
|
||||||
|
variableValues = this.wiki.filterTiddlers(filterValues,this);
|
||||||
|
if(!$tw.utils.isArrayEqual(this.variableNames,variableNames) || !$tw.utils.isArrayEqual(this.variableValues,variableValues)) {
|
||||||
|
this.refreshSelf();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return this.refreshChildren(changedTiddlers);
|
||||||
|
};
|
||||||
|
|
||||||
|
exports["setmultiplevariables"] = SetMultipleVariablesWidget;
|
||||||
|
|
||||||
|
})();
|
||||||
|
|
||||||
@@ -29,14 +29,12 @@ var VarsWidget = function(parseTreeNode,options) {
|
|||||||
/*
|
/*
|
||||||
Inherit from the base widget class
|
Inherit from the base widget class
|
||||||
*/
|
*/
|
||||||
VarsWidget.prototype = Object.create(Widget.prototype);
|
VarsWidget.prototype = new Widget();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Render this widget into the DOM
|
Render this widget into the DOM
|
||||||
*/
|
*/
|
||||||
VarsWidget.prototype.render = function(parent,nextSibling) {
|
VarsWidget.prototype.render = function(parent,nextSibling) {
|
||||||
// Call the constructor
|
|
||||||
Widget.call(this);
|
|
||||||
this.parentDomNode = parent;
|
this.parentDomNode = parent;
|
||||||
this.computeAttributes();
|
this.computeAttributes();
|
||||||
this.execute();
|
this.execute();
|
||||||
@@ -63,7 +61,7 @@ Refresh the widget by ensuring our attributes are up to date
|
|||||||
*/
|
*/
|
||||||
VarsWidget.prototype.refresh = function(changedTiddlers) {
|
VarsWidget.prototype.refresh = function(changedTiddlers) {
|
||||||
var changedAttributes = this.computeAttributes();
|
var changedAttributes = this.computeAttributes();
|
||||||
if(Object.keys(changedAttributes).length) {
|
if($tw.utils.count(changedAttributes) > 0) {
|
||||||
this.refreshSelf();
|
this.refreshSelf();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ Widget.prototype.getVariableInfo = function(name,options) {
|
|||||||
});
|
});
|
||||||
// Only substitute variable references if this variable was defined with the \define pragma
|
// Only substitute variable references if this variable was defined with the \define pragma
|
||||||
if(variable.isMacroDefinition) {
|
if(variable.isMacroDefinition) {
|
||||||
value = this.substituteVariableReferences(value);
|
value = this.substituteVariableReferences(value,options);
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
text: value,
|
text: value,
|
||||||
@@ -175,10 +175,10 @@ Widget.prototype.resolveVariableParameters = function(formalParams,actualParams)
|
|||||||
return results;
|
return results;
|
||||||
};
|
};
|
||||||
|
|
||||||
Widget.prototype.substituteVariableReferences = function(text) {
|
Widget.prototype.substituteVariableReferences = function(text,options) {
|
||||||
var self = this;
|
var self = this;
|
||||||
return (text || "").replace(/\$\(([^\)\$]+)\)\$/g,function(match,p1,offset,string) {
|
return (text || "").replace(/\$\(([^\)\$]+)\)\$/g,function(match,p1,offset,string) {
|
||||||
return self.getVariable(p1,{defaultValue: ""});
|
return options.variables && options.variables[p1] || (self.getVariable(p1,{defaultValue: ""}));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -263,19 +263,9 @@ Compute the current values of the attributes of the widget. Returns a hashmap of
|
|||||||
*/
|
*/
|
||||||
Widget.prototype.computeAttributes = function() {
|
Widget.prototype.computeAttributes = function() {
|
||||||
var changedAttributes = {},
|
var changedAttributes = {},
|
||||||
self = this,
|
self = this;
|
||||||
value;
|
|
||||||
$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {
|
$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {
|
||||||
if(attribute.type === "filtered") {
|
var value = self.computeAttribute(attribute);
|
||||||
value = self.wiki.filterTiddlers(attribute.filter,self)[0] || "";
|
|
||||||
} else if(attribute.type === "indirect") {
|
|
||||||
value = self.wiki.getTextReference(attribute.textReference,"",self.getVariable("currentTiddler"));
|
|
||||||
} else if(attribute.type === "macro") {
|
|
||||||
value = self.getVariable(attribute.value.name,{params: attribute.value.params});
|
|
||||||
} else { // String attribute
|
|
||||||
value = attribute.value;
|
|
||||||
}
|
|
||||||
// Check whether the attribute has changed
|
|
||||||
if(self.attributes[name] !== value) {
|
if(self.attributes[name] !== value) {
|
||||||
self.attributes[name] = value;
|
self.attributes[name] = value;
|
||||||
changedAttributes[name] = true;
|
changedAttributes[name] = true;
|
||||||
@@ -284,6 +274,20 @@ Widget.prototype.computeAttributes = function() {
|
|||||||
return changedAttributes;
|
return changedAttributes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Widget.prototype.computeAttribute = function(attribute) {
|
||||||
|
var value;
|
||||||
|
if(attribute.type === "filtered") {
|
||||||
|
value = this.wiki.filterTiddlers(attribute.filter,this)[0] || "";
|
||||||
|
} else if(attribute.type === "indirect") {
|
||||||
|
value = this.wiki.getTextReference(attribute.textReference,"",this.getVariable("currentTiddler"));
|
||||||
|
} else if(attribute.type === "macro") {
|
||||||
|
value = this.getVariable(attribute.value.name,{params: attribute.value.params});
|
||||||
|
} else { // String attribute
|
||||||
|
value = attribute.value;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Check for the presence of an attribute
|
Check for the presence of an attribute
|
||||||
*/
|
*/
|
||||||
@@ -310,24 +314,40 @@ excludeEventAttributes: ignores attributes whose name begins with "on"
|
|||||||
Widget.prototype.assignAttributes = function(domNode,options) {
|
Widget.prototype.assignAttributes = function(domNode,options) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
var self = this;
|
var self = this;
|
||||||
$tw.utils.each(this.attributes,function(v,a) {
|
var assignAttribute = function(name,value) {
|
||||||
// Check exclusions
|
// Check for excluded attribute names
|
||||||
if(options.excludeEventAttributes && a.substr(0,2) === "on") {
|
if(options.excludeEventAttributes && name.substr(0,2) === "on") {
|
||||||
v = undefined;
|
value = undefined;
|
||||||
}
|
}
|
||||||
if(v !== undefined) {
|
if(value !== undefined) {
|
||||||
var b = a.split(":");
|
// Handle the xlink: namespace
|
||||||
// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)
|
var namespace = null;
|
||||||
try {
|
if(name.substr(0,6) === "xlink:" && name.length > 6) {
|
||||||
if (b.length == 2 && b[0] == "xlink"){
|
namespace = "http://www.w3.org/1999/xlink";
|
||||||
domNode.setAttributeNS("http://www.w3.org/1999/xlink",b[1],v);
|
name = name.substr(6);
|
||||||
} else {
|
}
|
||||||
domNode.setAttributeNS(null,a,v);
|
// Handle styles
|
||||||
|
if(name.substr(0,6) === "style." && name.length > 6) {
|
||||||
|
domNode.style[$tw.utils.unHyphenateCss(name.substr(6))] = value;
|
||||||
|
} else {
|
||||||
|
// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)
|
||||||
|
try {
|
||||||
|
domNode.setAttributeNS(namespace,name,value);
|
||||||
|
} catch(e) {
|
||||||
}
|
}
|
||||||
} catch(e) {
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
// Not all parse tree nodes have the orderedAttributes property
|
||||||
|
if(this.parseTreeNode.orderedAttributes) {
|
||||||
|
$tw.utils.each(this.parseTreeNode.orderedAttributes,function(attribute,index) {
|
||||||
|
assignAttribute(attribute.name,self.attributes[attribute.name]);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$tw.utils.each(Object.keys(self.attributes).sort(),function(name) {
|
||||||
|
assignAttribute(name,self.attributes[name]);
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -570,7 +590,7 @@ Widget.prototype.invokeActions = function(triggeringWidget,event) {
|
|||||||
for(var t=0; t<this.children.length; t++) {
|
for(var t=0; t<this.children.length; t++) {
|
||||||
var child = this.children[t],
|
var child = this.children[t],
|
||||||
childIsActionWidget = !!child.invokeAction,
|
childIsActionWidget = !!child.invokeAction,
|
||||||
actionRefreshPolicy = child.getVariable("tv-action-refresh-policy");
|
actionRefreshPolicy = child.getVariable("tv-action-refresh-policy"); // Default is "once"
|
||||||
// Refresh the child if required
|
// Refresh the child if required
|
||||||
if(childIsActionWidget || actionRefreshPolicy === "always") {
|
if(childIsActionWidget || actionRefreshPolicy === "always") {
|
||||||
child.refreshSelf();
|
child.refreshSelf();
|
||||||
|
|||||||
@@ -46,26 +46,31 @@ function relinkTiddler(fromTitle,toTitle,options) {
|
|||||||
if(!tiddler.fields["plugin-type"] && type !== "application/javascript") {
|
if(!tiddler.fields["plugin-type"] && type !== "application/javascript") {
|
||||||
var tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,
|
var tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,
|
||||||
list = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,
|
list = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,
|
||||||
isModified = false;
|
isModified = false,
|
||||||
|
processList = function(listField) {
|
||||||
|
if(listField && listField.indexOf(fromTitle) !== -1) {
|
||||||
|
// Remove any existing instances of the toTitle
|
||||||
|
var p = listField.indexOf(toTitle);
|
||||||
|
while(p !== -1) {
|
||||||
|
listField.splice(p,1);
|
||||||
|
p = listField.indexOf(toTitle);
|
||||||
|
}
|
||||||
|
// Replace the fromTitle with toTitle
|
||||||
|
$tw.utils.each(listField,function (title,index) {
|
||||||
|
if(title === fromTitle) {
|
||||||
|
listField[index] = toTitle;
|
||||||
|
isModified = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
if(!options.dontRenameInTags) {
|
if(!options.dontRenameInTags) {
|
||||||
// Rename tags
|
// Rename tags
|
||||||
$tw.utils.each(tags,function (title,index) {
|
processList(tags);
|
||||||
if(title === fromTitle) {
|
|
||||||
console.log("Renaming tag '" + tags[index] + "' to '" + toTitle + "' of tiddler '" + tiddler.fields.title + "'");
|
|
||||||
tags[index] = toTitle;
|
|
||||||
isModified = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
if(!options.dontRenameInLists) {
|
if(!options.dontRenameInLists) {
|
||||||
// Rename lists
|
// Rename lists
|
||||||
$tw.utils.each(list,function (title,index) {
|
processList(list);
|
||||||
if(title === fromTitle) {
|
|
||||||
console.log("Renaming list item '" + list[index] + "' to '" + toTitle + "' of tiddler '" + tiddler.fields.title + "'");
|
|
||||||
list[index] = toTitle;
|
|
||||||
isModified = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
if(isModified) {
|
if(isModified) {
|
||||||
var newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields())
|
var newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields())
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ exports.setText = function(title,field,index,value,options) {
|
|||||||
} else {
|
} else {
|
||||||
delete data[index];
|
delete data[index];
|
||||||
}
|
}
|
||||||
this.setTiddlerData(title,data,modificationFields);
|
this.setTiddlerData(title,data,{},{suppressTimestamp: options.suppressTimestamp});
|
||||||
} else {
|
} else {
|
||||||
var tiddler = this.getTiddler(title),
|
var tiddler = this.getTiddler(title),
|
||||||
fields = {title: title};
|
fields = {title: title};
|
||||||
@@ -365,47 +365,108 @@ Sort an array of tiddler titles by a specified field
|
|||||||
*/
|
*/
|
||||||
exports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric) {
|
exports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric) {
|
||||||
var self = this;
|
var self = this;
|
||||||
titles.sort(function(a,b) {
|
if(sortField === "title") {
|
||||||
var x,y,
|
if(!isNumeric && !isAlphaNumeric) {
|
||||||
compareNumbers = function(x,y) {
|
if(isCaseSensitive) {
|
||||||
var result =
|
if(isDescending) {
|
||||||
isNaN(x) && !isNaN(y) ? (isDescending ? -1 : 1) :
|
titles.sort(function(a,b) {
|
||||||
!isNaN(x) && isNaN(y) ? (isDescending ? 1 : -1) :
|
return b.localeCompare(a);
|
||||||
(isDescending ? y - x : x - y);
|
});
|
||||||
return result;
|
} else {
|
||||||
};
|
titles.sort(function(a,b) {
|
||||||
if(sortField !== "title") {
|
return a.localeCompare(b);
|
||||||
var tiddlerA = self.getTiddler(a),
|
});
|
||||||
tiddlerB = self.getTiddler(b);
|
}
|
||||||
if(tiddlerA) {
|
|
||||||
a = tiddlerA.getFieldString(sortField) || "";
|
|
||||||
} else {
|
} else {
|
||||||
a = "";
|
if(isDescending) {
|
||||||
|
titles.sort(function(a,b) {
|
||||||
|
return b.toLowerCase().localeCompare(a.toLowerCase());
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
titles.sort(function(a,b) {
|
||||||
|
return a.toLowerCase().localeCompare(b.toLowerCase());
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(tiddlerB) {
|
|
||||||
b = tiddlerB.getFieldString(sortField) || "";
|
|
||||||
} else {
|
|
||||||
b = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
x = Number(a);
|
|
||||||
y = Number(b);
|
|
||||||
if(isNumeric && (!isNaN(x) || !isNaN(y))) {
|
|
||||||
return compareNumbers(x,y);
|
|
||||||
} else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {
|
|
||||||
return isDescending ? b - a : a - b;
|
|
||||||
} else if(isAlphaNumeric) {
|
|
||||||
return isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: "base"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: "base"});
|
|
||||||
} else {
|
} else {
|
||||||
|
titles.sort(function(a,b) {
|
||||||
|
var x,y;
|
||||||
|
if(isNumeric) {
|
||||||
|
x = Number(a);
|
||||||
|
y = Number(b);
|
||||||
|
if(isNaN(x)) {
|
||||||
|
if(isNaN(y)) {
|
||||||
|
// If neither value is a number then fall through to a textual comparison
|
||||||
|
} else {
|
||||||
|
return isDescending ? -1 : 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(isNaN(y)) {
|
||||||
|
return isDescending ? 1 : -1;
|
||||||
|
} else {
|
||||||
|
return isDescending ? y - x : x - y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(isAlphaNumeric) {
|
||||||
|
return isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: "base"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: "base"});
|
||||||
|
}
|
||||||
|
if(!isCaseSensitive) {
|
||||||
|
a = a.toLowerCase();
|
||||||
|
b = b.toLowerCase();
|
||||||
|
}
|
||||||
|
return isDescending ? b.localeCompare(a) : a.localeCompare(b);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
titles.sort(function(a,b) {
|
||||||
|
var x,y;
|
||||||
|
if(sortField !== "title") {
|
||||||
|
var tiddlerA = self.getTiddler(a),
|
||||||
|
tiddlerB = self.getTiddler(b);
|
||||||
|
if(tiddlerA) {
|
||||||
|
a = tiddlerA.fields[sortField] || "";
|
||||||
|
} else {
|
||||||
|
a = "";
|
||||||
|
}
|
||||||
|
if(tiddlerB) {
|
||||||
|
b = tiddlerB.fields[sortField] || "";
|
||||||
|
} else {
|
||||||
|
b = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(isNumeric) {
|
||||||
|
x = Number(a);
|
||||||
|
y = Number(b);
|
||||||
|
if(isNaN(x)) {
|
||||||
|
if(isNaN(y)) {
|
||||||
|
// If neither value is a number then fall through to a textual comparison
|
||||||
|
} else {
|
||||||
|
return isDescending ? -1 : 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(isNaN(y)) {
|
||||||
|
return isDescending ? 1 : -1;
|
||||||
|
} else {
|
||||||
|
return isDescending ? y - x : x - y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(Object.prototype.toString.call(a) === "[object Date]" && Object.prototype.toString.call(b) === "[object Date]") {
|
||||||
|
return isDescending ? b - a : a - b;
|
||||||
|
}
|
||||||
a = String(a);
|
a = String(a);
|
||||||
b = String(b);
|
b = String(b);
|
||||||
|
if(isAlphaNumeric) {
|
||||||
|
return isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: "base"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: "base"});
|
||||||
|
}
|
||||||
if(!isCaseSensitive) {
|
if(!isCaseSensitive) {
|
||||||
a = a.toLowerCase();
|
a = a.toLowerCase();
|
||||||
b = b.toLowerCase();
|
b = b.toLowerCase();
|
||||||
}
|
}
|
||||||
return isDescending ? b.localeCompare(a) : a.localeCompare(b);
|
return isDescending ? b.localeCompare(a) : a.localeCompare(b);
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -795,19 +856,24 @@ Set a tiddlers content to a JavaScript object. Currently this is done by setting
|
|||||||
title: title of tiddler
|
title: title of tiddler
|
||||||
data: object that can be serialised to JSON
|
data: object that can be serialised to JSON
|
||||||
fields: optional hashmap of additional tiddler fields to be set
|
fields: optional hashmap of additional tiddler fields to be set
|
||||||
|
options: optional hashmap of options including:
|
||||||
|
suppressTimestamp: if true, don't set the creation/modification timestamps
|
||||||
*/
|
*/
|
||||||
exports.setTiddlerData = function(title,data,fields) {
|
exports.setTiddlerData = function(title,data,fields,options) {
|
||||||
|
options = options || {};
|
||||||
var existingTiddler = this.getTiddler(title),
|
var existingTiddler = this.getTiddler(title),
|
||||||
|
creationFields = options.suppressTimestamp ? {} : this.getCreationFields(),
|
||||||
|
modificationFields = options.suppressTimestamp ? {} : this.getModificationFields(),
|
||||||
newFields = {
|
newFields = {
|
||||||
title: title
|
title: title
|
||||||
};
|
};
|
||||||
if(existingTiddler && existingTiddler.fields.type === "application/x-tiddler-dictionary") {
|
if(existingTiddler && existingTiddler.fields.type === "application/x-tiddler-dictionary") {
|
||||||
newFields.text = $tw.utils.makeTiddlerDictionary(data);
|
newFields.text = $tw.utils.makeTiddlerDictionary(data);
|
||||||
} else {
|
} else {
|
||||||
newFields.type = "application/json";
|
newFields.type = "application/json";
|
||||||
newFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);
|
newFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);
|
||||||
}
|
}
|
||||||
this.addTiddler(new $tw.Tiddler(this.getCreationFields(),existingTiddler,fields,newFields,this.getModificationFields()));
|
this.addTiddler(new $tw.Tiddler(creationFields,existingTiddler,fields,newFields,modificationFields));
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -844,7 +910,7 @@ exports.clearGlobalCache = function() {
|
|||||||
exports.getCacheForTiddler = function(title,cacheName,initializer) {
|
exports.getCacheForTiddler = function(title,cacheName,initializer) {
|
||||||
this.caches = this.caches || Object.create(null);
|
this.caches = this.caches || Object.create(null);
|
||||||
var caches = this.caches[title];
|
var caches = this.caches[title];
|
||||||
if(caches && caches[cacheName]) {
|
if(caches && caches[cacheName] !== undefined) {
|
||||||
return caches[cacheName];
|
return caches[cacheName];
|
||||||
} else {
|
} else {
|
||||||
if(!caches) {
|
if(!caches) {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ title: $:/core/templates/tiddlywiki5.html
|
|||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||||
<!--~~ Raw markup for the top of the head section ~~-->
|
<!--~~ Raw markup for the top of the head section ~~-->
|
||||||
`{{{ [<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`
|
`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=Edge"/>
|
<meta http-equiv="X-UA-Compatible" content="IE=Edge"/>
|
||||||
<meta name="application-name" content="TiddlyWiki" />
|
<meta name="application-name" content="TiddlyWiki" />
|
||||||
<meta name="generator" content="TiddlyWiki" />
|
<meta name="generator" content="TiddlyWiki" />
|
||||||
|
|||||||
@@ -19,71 +19,73 @@ $:/config/Plugins/Disabled/$(currentTiddler)$
|
|||||||
\end
|
\end
|
||||||
|
|
||||||
\define plugin-table-body(type,disabledMessage,default-popup-state)
|
\define plugin-table-body(type,disabledMessage,default-popup-state)
|
||||||
|
\whitespace trim
|
||||||
<div class="tc-plugin-info-chunk tc-plugin-info-toggle">
|
<div class="tc-plugin-info-chunk tc-plugin-info-toggle">
|
||||||
<$reveal type="nomatch" state=<<popup-state>> text="yes" default="""$default-popup-state$""">
|
<$reveal type="nomatch" state=<<popup-state>> text="yes" default="""$default-popup-state$""">
|
||||||
<$button class="tc-btn-invisible tc-btn-dropdown" set=<<popup-state>> setTo="yes">
|
<$button class="tc-btn-invisible tc-btn-dropdown" set=<<popup-state>> setTo="yes">
|
||||||
{{$:/core/images/chevron-right}}
|
{{$:/core/images/chevron-right}}
|
||||||
</$button>
|
</$button>
|
||||||
</$reveal>
|
</$reveal>
|
||||||
<$reveal type="match" state=<<popup-state>> text="yes" default="""$default-popup-state$""">
|
<$reveal type="match" state=<<popup-state>> text="yes" default="""$default-popup-state$""">
|
||||||
<$button class="tc-btn-invisible tc-btn-dropdown" set=<<popup-state>> setTo="no">
|
<$button class="tc-btn-invisible tc-btn-dropdown" set=<<popup-state>> setTo="no">
|
||||||
{{$:/core/images/chevron-down}}
|
{{$:/core/images/chevron-down}}
|
||||||
</$button>
|
</$button>
|
||||||
</$reveal>
|
</$reveal>
|
||||||
</div>
|
</div>
|
||||||
<div class="tc-plugin-info-chunk tc-plugin-info-icon">
|
<div class="tc-plugin-info-chunk tc-plugin-info-icon">
|
||||||
<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>
|
<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>
|
||||||
<$transclude tiddler="$:/core/images/plugin-generic-$type$"/>
|
<$transclude tiddler="$:/core/images/plugin-generic-$type$"/>
|
||||||
</$transclude>
|
</$transclude>
|
||||||
</div>
|
</div>
|
||||||
<div class="tc-plugin-info-chunk tc-plugin-info-description">
|
<div class="tc-plugin-info-chunk tc-plugin-info-description">
|
||||||
<h1>
|
<h1>
|
||||||
''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$view field="description"><$view field="title"/></$view> $disabledMessage$
|
''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$view field="description"><$view field="title"/></$view> $disabledMessage$
|
||||||
</h1>
|
</h1>
|
||||||
<h2>
|
<h2>
|
||||||
<$view field="title"/>
|
<$view field="title"/>
|
||||||
</h2>
|
</h2>
|
||||||
<h2>
|
<h2>
|
||||||
<div><em><$view field="version"/></em></div>
|
<div><em><$view field="version"/></em></div>
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
\end
|
\end
|
||||||
|
|
||||||
\define plugin-info(type,default-popup-state)
|
\define plugin-info(type,default-popup-state)
|
||||||
|
\whitespace trim
|
||||||
<$set name="popup-state" value=<<popup-state-macro>>>
|
<$set name="popup-state" value=<<popup-state-macro>>>
|
||||||
<$reveal type="nomatch" state=<<plugin-disable-title>> text="yes">
|
<$reveal type="nomatch" state=<<plugin-disable-title>> text="yes">
|
||||||
<$link to={{!!title}} class="tc-plugin-info">
|
<$link to={{!!title}} class="tc-plugin-info">
|
||||||
<<plugin-table-body type:"$type$" default-popup-state:"""$default-popup-state$""">>
|
<<plugin-table-body type:"$type$" default-popup-state:"""$default-popup-state$""">>
|
||||||
</$link>
|
</$link>
|
||||||
</$reveal>
|
</$reveal>
|
||||||
<$reveal type="match" state=<<plugin-disable-title>> text="yes">
|
<$reveal type="match" state=<<plugin-disable-title>> text="yes">
|
||||||
<$link to={{!!title}} class="tc-plugin-info tc-plugin-info-disabled">
|
<$link to={{!!title}} class="tc-plugin-info tc-plugin-info-disabled">
|
||||||
<<plugin-table-body type:"$type$" default-popup-state:"""$default-popup-state$""" disabledMessage:"<$macrocall $name='lingo' title='Disabled/Status'/>">>
|
<<plugin-table-body type:"$type$" default-popup-state:"""$default-popup-state$""" disabledMessage:"<$macrocall $name='lingo' title='Disabled/Status'/>">>
|
||||||
</$link>
|
</$link>
|
||||||
</$reveal>
|
</$reveal>
|
||||||
<$reveal type="match" text="yes" state=<<popup-state>> default="""$default-popup-state$""">
|
<$reveal type="match" text="yes" state=<<popup-state>> default="""$default-popup-state$""">
|
||||||
<div class="tc-plugin-info-dropdown">
|
<div class="tc-plugin-info-dropdown">
|
||||||
<div class="tc-plugin-info-dropdown-body">
|
<div class="tc-plugin-info-dropdown-body">
|
||||||
<$list filter="[all[current]] -[[$:/core]]">
|
<$list filter="[all[current]] -[[$:/core]]">
|
||||||
<div style="float:right;">
|
<div style="float:right;">
|
||||||
<$reveal type="nomatch" state=<<plugin-disable-title>> text="yes">
|
<$reveal type="nomatch" state=<<plugin-disable-title>> text="yes">
|
||||||
<$button set=<<plugin-disable-title>> setTo="yes" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>
|
<$button set=<<plugin-disable-title>> setTo="yes" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>
|
||||||
<<lingo Disable/Caption>>
|
<<lingo Disable/Caption>>
|
||||||
</$button>
|
</$button>
|
||||||
</$reveal>
|
</$reveal>
|
||||||
<$reveal type="match" state=<<plugin-disable-title>> text="yes">
|
<$reveal type="match" state=<<plugin-disable-title>> text="yes">
|
||||||
<$button set=<<plugin-disable-title>> setTo="no" tooltip={{$:/language/ControlPanel/Plugins/Enable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>
|
<$button set=<<plugin-disable-title>> setTo="no" tooltip={{$:/language/ControlPanel/Plugins/Enable Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>
|
||||||
<<lingo Enable/Caption>>
|
<<lingo Enable/Caption>>
|
||||||
</$button>
|
</$button>
|
||||||
</$reveal>
|
</$reveal>
|
||||||
</div>
|
</div>
|
||||||
</$list>
|
</$list>
|
||||||
<$set name="tabsList" filter="[<currentTiddler>list[]] contents">
|
<$set name="tabsList" filter="[<currentTiddler>list[]] contents">
|
||||||
<$macrocall $name="tabs" state=<<tabs-state-macro>> tabsList=<<tabsList>> default={{{ [enlist<tabsList>] }}} template="$:/core/ui/PluginInfo"/>
|
<$macrocall $name="tabs" state=<<tabs-state-macro>> tabsList=<<tabsList>> default={{{ [enlist<tabsList>] }}} template="$:/core/ui/PluginInfo"/>
|
||||||
</$set>
|
</$set>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</$reveal>
|
</$reveal>
|
||||||
</$set>
|
</$set>
|
||||||
\end
|
\end
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
title: $:/core/ui/Components/tag-link
|
title: $:/core/ui/Components/tag-link
|
||||||
|
|
||||||
<$link>
|
<$link>
|
||||||
<$set name="backgroundColor" value={{!!color}}>
|
<$set name="backgroundColor" value={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}>
|
||||||
<span style=<<tag-styles>> class="tc-tag-label">
|
<span style=<<tag-styles>> class="tc-tag-label">
|
||||||
<$view field="title" format="text"/>
|
<$view field="title" format="text"/>
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
9
core/ui/ControlPanel/Cascades.tid
Normal file
9
core/ui/ControlPanel/Cascades.tid
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
title: $:/core/ui/ControlPanel/Cascades
|
||||||
|
tags: $:/tags/ControlPanel/Advanced
|
||||||
|
caption: {{$:/language/ControlPanel/Cascades/Caption}}
|
||||||
|
|
||||||
|
{{$:/language/ControlPanel/Cascades/Hint}}
|
||||||
|
|
||||||
|
<div class="tc-control-panel">
|
||||||
|
<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Cascades]!has[draft.of]]" default="$:/core/ui/ControlPanel/StoryTiddler"/>
|
||||||
|
</div>
|
||||||
9
core/ui/ControlPanel/Cascades/EditTemplateBody.tid
Normal file
9
core/ui/ControlPanel/Cascades/EditTemplateBody.tid
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
title: $:/core/ui/ControlPanel/EditTemplateBody
|
||||||
|
tags: $:/tags/ControlPanel/Cascades
|
||||||
|
caption: {{$:/language/ControlPanel/EditTemplateBody/Caption}}
|
||||||
|
|
||||||
|
\define lingo-base() $:/language/ControlPanel/EditTemplateBody/
|
||||||
|
|
||||||
|
<<lingo Hint>>
|
||||||
|
|
||||||
|
{{$:/tags/EditTemplateBodyFilter||$:/snippets/ListTaggedCascade}}
|
||||||
9
core/ui/ControlPanel/Cascades/StoryTiddler.tid
Normal file
9
core/ui/ControlPanel/Cascades/StoryTiddler.tid
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
title: $:/core/ui/ControlPanel/StoryTiddler
|
||||||
|
tags: $:/tags/ControlPanel/Cascades
|
||||||
|
caption: {{$:/language/ControlPanel/StoryTiddler/Caption}}
|
||||||
|
|
||||||
|
\define lingo-base() $:/language/ControlPanel/StoryTiddler/
|
||||||
|
|
||||||
|
<<lingo Hint>>
|
||||||
|
|
||||||
|
{{$:/tags/StoryTiddlerTemplateFilter||$:/snippets/ListTaggedCascade}}
|
||||||
9
core/ui/ControlPanel/Cascades/TiddlerColour.tid
Normal file
9
core/ui/ControlPanel/Cascades/TiddlerColour.tid
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
title: $:/core/ui/ControlPanel/TiddlerColour
|
||||||
|
tags: $:/tags/ControlPanel/Cascades
|
||||||
|
caption: {{$:/language/ControlPanel/TiddlerColour/Caption}}
|
||||||
|
|
||||||
|
\define lingo-base() $:/language/ControlPanel/TiddlerColour/
|
||||||
|
|
||||||
|
<<lingo Hint>>
|
||||||
|
|
||||||
|
{{$:/tags/TiddlerColourFilter||$:/snippets/ListTaggedCascade}}
|
||||||
9
core/ui/ControlPanel/Cascades/TiddlerIcon.tid
Normal file
9
core/ui/ControlPanel/Cascades/TiddlerIcon.tid
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
title: $:/core/ui/ControlPanel/TiddlerIcon
|
||||||
|
tags: $:/tags/ControlPanel/Cascades
|
||||||
|
caption: {{$:/language/ControlPanel/TiddlerIcon/Caption}}
|
||||||
|
|
||||||
|
\define lingo-base() $:/language/ControlPanel/TiddlerIcon/
|
||||||
|
|
||||||
|
<<lingo Hint>>
|
||||||
|
|
||||||
|
{{$:/tags/TiddlerIconFilter||$:/snippets/ListTaggedCascade}}
|
||||||
9
core/ui/ControlPanel/Cascades/ViewTemplateBody.tid
Normal file
9
core/ui/ControlPanel/Cascades/ViewTemplateBody.tid
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
title: $:/core/ui/ControlPanel/ViewTemplateBody
|
||||||
|
tags: $:/tags/ControlPanel/Cascades
|
||||||
|
caption: {{$:/language/ControlPanel/ViewTemplateBody/Caption}}
|
||||||
|
|
||||||
|
\define lingo-base() $:/language/ControlPanel/ViewTemplateBody/
|
||||||
|
|
||||||
|
<<lingo Hint>>
|
||||||
|
|
||||||
|
{{$:/tags/ViewTemplateBodyFilter||$:/snippets/ListTaggedCascade}}
|
||||||
9
core/ui/ControlPanel/Cascades/ViewTemplateTitle.tid
Normal file
9
core/ui/ControlPanel/Cascades/ViewTemplateTitle.tid
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
title: $:/core/ui/ControlPanel/ViewTemplateTitle
|
||||||
|
tags: $:/tags/ControlPanel/Cascades
|
||||||
|
caption: {{$:/language/ControlPanel/ViewTemplateTitle/Caption}}
|
||||||
|
|
||||||
|
\define lingo-base() $:/language/ControlPanel/ViewTemplateTitle/
|
||||||
|
|
||||||
|
<<lingo Hint>>
|
||||||
|
|
||||||
|
{{$:/tags/ViewTemplateTitleFilter||$:/snippets/ListTaggedCascade}}
|
||||||
@@ -16,4 +16,4 @@ caption: {{$:/language/ControlPanel/Plugins/Caption}}
|
|||||||
|
|
||||||
<<lingo Installed/Hint>>
|
<<lingo Installed/Hint>>
|
||||||
|
|
||||||
<$macrocall $name="tabs" tabsList="[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]" default="$:/core/ui/ControlPanel/Plugins/Installed/Plugins" explicitState="$:/state/tab--86143343"/>
|
<$macrocall $name="tabs" tabsList="[all[tiddlers+shadows]tag[$:/tags/ControlPanel/Plugins]!has[draft.of]]" default="$:/core/ui/ControlPanel/Plugins/Installed/Plugins" explicitState="$:/state/tab--86143343"/>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
title: $:/core/ui/ControlPanel/Plugins/Installed/Languages
|
title: $:/core/ui/ControlPanel/Plugins/Installed/Languages
|
||||||
|
tags: $:/tags/ControlPanel/Plugins
|
||||||
caption: {{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter="[!has[draft.of]plugin-type[language]]"/>)
|
caption: {{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter="[!has[draft.of]plugin-type[language]]"/>)
|
||||||
|
|
||||||
<<plugin-table language>>
|
<<plugin-table language>>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user