mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2026-01-25 04:14:40 +00:00
Compare commits
279 Commits
publishing
...
v5.2.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
66
boot/boot.js
66
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 {
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -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.
|
||||||
@@ -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.
|
||||||
|
|||||||
@@ -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;
|
||||||
|
};
|
||||||
|
|
||||||
|
})();
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -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;
|
|
||||||
|
|
||||||
})();
|
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -236,6 +236,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;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
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
|
||||||
*/
|
*/
|
||||||
@@ -570,7 +574,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();
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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>>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
title: $:/core/ui/ControlPanel/Plugins/Installed/Plugins
|
title: $:/core/ui/ControlPanel/Plugins/Installed/Plugins
|
||||||
|
tags: $:/tags/ControlPanel/Plugins
|
||||||
caption: {{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter="[!has[draft.of]plugin-type[plugin]]"/>)
|
caption: {{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter="[!has[draft.of]plugin-type[plugin]]"/>)
|
||||||
|
|
||||||
<<plugin-table plugin>>
|
<<plugin-table plugin>>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
title: $:/core/ui/ControlPanel/Plugins/Installed/Themes
|
title: $:/core/ui/ControlPanel/Plugins/Installed/Themes
|
||||||
|
tags: $:/tags/ControlPanel/Plugins
|
||||||
caption: {{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter="[!has[draft.of]plugin-type[theme]]"/>)
|
caption: {{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter="[!has[draft.of]plugin-type[theme]]"/>)
|
||||||
|
|
||||||
<<plugin-table theme>>
|
<<plugin-table theme>>
|
||||||
|
|||||||
@@ -1,54 +1,4 @@
|
|||||||
title: $:/core/ui/EditTemplate/body
|
title: $:/core/ui/EditTemplate/body
|
||||||
tags: $:/tags/EditTemplate
|
tags: $:/tags/EditTemplate
|
||||||
|
|
||||||
\define lingo-base() $:/language/EditTemplate/Body/
|
<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/EditTemplateBodyFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/EditTemplate/body/default]] }}} />
|
||||||
\define config-visibility-title()
|
|
||||||
$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$
|
|
||||||
\end
|
|
||||||
|
|
||||||
\define importFileActions()
|
|
||||||
<$action-popup $state=<<importState>> $coords="(0,0,0,0)" $floating="yes"/>
|
|
||||||
\end
|
|
||||||
|
|
||||||
<$list filter="[all[current]has[_canonical_uri]]">
|
|
||||||
|
|
||||||
<div class="tc-message-box">
|
|
||||||
|
|
||||||
<<lingo External/Hint>>
|
|
||||||
|
|
||||||
<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>
|
|
||||||
|
|
||||||
<$edit-text field="_canonical_uri" class="tc-edit-fields" tabindex={{$:/config/EditTabIndex}} cancelPopups="yes"></$edit-text>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</$list>
|
|
||||||
|
|
||||||
<$list filter="[all[current]!has[_canonical_uri]]">
|
|
||||||
<$vars importTitle=<<qualify $:/ImportImage>> importState=<<qualify $:/state/ImportImage>> >
|
|
||||||
<$dropzone importTitle=<<importTitle>> autoOpenOnImport="no" contentTypesFilter={{$:/config/Editor/ImportContentTypesFilter}} class="tc-dropzone-editor" enable={{{ [{$:/config/DragAndDrop/Enable}match[no]] :else[subfilter{$:/config/Editor/EnableImportFilter}then[yes]else[no]] }}} filesOnly="yes" actions=<<importFileActions>> ><$reveal state="$:/state/showeditpreview" type="match" text="yes">
|
|
||||||
<div class="tc-tiddler-preview">
|
|
||||||
|
|
||||||
<$transclude tiddler="$:/core/ui/EditTemplate/body/editor" mode="inline"/>
|
|
||||||
|
|
||||||
<div class="tc-tiddler-preview-preview">
|
|
||||||
|
|
||||||
<$transclude tiddler={{$:/state/editpreviewtype}} mode="inline">
|
|
||||||
|
|
||||||
<$transclude tiddler="$:/core/ui/EditTemplate/body/preview/output" mode="inline"/>
|
|
||||||
|
|
||||||
</$transclude>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</$reveal>
|
|
||||||
|
|
||||||
<$reveal state="$:/state/showeditpreview" type="nomatch" text="yes">
|
|
||||||
|
|
||||||
<$transclude tiddler="$:/core/ui/EditTemplate/body/editor" mode="inline"/>
|
|
||||||
|
|
||||||
</$reveal>
|
|
||||||
</$dropzone>
|
|
||||||
</$vars>
|
|
||||||
</$list>
|
|
||||||
|
|||||||
13
core/ui/EditTemplate/body/canonical-uri.tid
Normal file
13
core/ui/EditTemplate/body/canonical-uri.tid
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
title: $:/core/ui/EditTemplate/body/canonical-uri
|
||||||
|
|
||||||
|
\define lingo-base() $:/language/EditTemplate/Body/
|
||||||
|
|
||||||
|
<div class="tc-message-box">
|
||||||
|
|
||||||
|
<<lingo External/Hint>>
|
||||||
|
|
||||||
|
<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>
|
||||||
|
|
||||||
|
<$edit-text field="_canonical_uri" class="tc-edit-fields" tabindex={{$:/config/EditTabIndex}} cancelPopups="yes"></$edit-text>
|
||||||
|
|
||||||
|
</div>
|
||||||
38
core/ui/EditTemplate/body/default.tid
Normal file
38
core/ui/EditTemplate/body/default.tid
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
title: $:/core/ui/EditTemplate/body/default
|
||||||
|
|
||||||
|
\define config-visibility-title()
|
||||||
|
$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$
|
||||||
|
\end
|
||||||
|
|
||||||
|
\define importFileActions()
|
||||||
|
<$action-popup $state=<<importState>> $coords="(0,0,0,0)" $floating="yes"/>
|
||||||
|
\end
|
||||||
|
|
||||||
|
<$set name="edit-preview-state" value={{{ [{$:/config/ShowEditPreview/PerTiddler}!match[yes]then[$:/state/showeditpreview]] :else[<qualify "$:/state/showeditpreview">] }}}>
|
||||||
|
<$vars importTitle=<<qualify $:/ImportImage>> importState=<<qualify $:/state/ImportImage>> >
|
||||||
|
<$dropzone importTitle=<<importTitle>> autoOpenOnImport="no" contentTypesFilter={{$:/config/Editor/ImportContentTypesFilter}} class="tc-dropzone-editor" enable={{{ [{$:/config/DragAndDrop/Enable}match[no]] :else[subfilter{$:/config/Editor/EnableImportFilter}then[yes]else[no]] }}} filesOnly="yes" actions=<<importFileActions>> ><$reveal stateTitle=<<edit-preview-state>> type="match" text="yes">
|
||||||
|
<div class="tc-tiddler-preview">
|
||||||
|
|
||||||
|
<$transclude tiddler="$:/core/ui/EditTemplate/body/editor" mode="inline"/>
|
||||||
|
|
||||||
|
<div class="tc-tiddler-preview-preview">
|
||||||
|
|
||||||
|
<$transclude tiddler={{$:/state/editpreviewtype}} mode="inline">
|
||||||
|
|
||||||
|
<$transclude tiddler="$:/core/ui/EditTemplate/body/preview/output" mode="inline"/>
|
||||||
|
|
||||||
|
</$transclude>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</$reveal>
|
||||||
|
|
||||||
|
<$reveal stateTitle=<<edit-preview-state>> type="nomatch" text="yes">
|
||||||
|
|
||||||
|
<$transclude tiddler="$:/core/ui/EditTemplate/body/editor" mode="inline"/>
|
||||||
|
|
||||||
|
</$reveal>
|
||||||
|
</$dropzone>
|
||||||
|
</$vars>
|
||||||
|
</$set>
|
||||||
@@ -29,7 +29,7 @@ color:$(foregroundColor)$;
|
|||||||
\whitespace trim
|
\whitespace trim
|
||||||
<div class="tc-edit-tags">
|
<div class="tc-edit-tags">
|
||||||
<$list filter="[list[!!$tagField$]sort[title]]" storyview="pop">
|
<$list filter="[list[!!$tagField$]sort[title]]" storyview="pop">
|
||||||
<$macrocall $name="tag-body" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}} tagField=<<__tagField__>>/>
|
<$macrocall $name="tag-body" colour={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}} palette={{$:/palette}} icon={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}} tagField=<<__tagField__>>/>
|
||||||
</$list>
|
</$list>
|
||||||
<$vars tabIndex={{$:/config/EditTabIndex}} cancelPopups="yes">
|
<$vars tabIndex={{$:/config/EditTabIndex}} cancelPopups="yes">
|
||||||
<$macrocall $name="tag-picker" tagField=<<__tagField__>>/>
|
<$macrocall $name="tag-picker" tagField=<<__tagField__>>/>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ title: $:/core/ui/EditorToolbar/link-dropdown
|
|||||||
<$set name="userInput" value={{{ [<storeTitle>get[text]] }}}><$list filter="[<searchTiddler>get[text]!match<userInput>]" emptyMessage="""<$action-deletetiddler $filter="[<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]"/>"""><$action-setfield $tiddler=<<searchTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text="yes"/></$list></$set>
|
<$set name="userInput" value={{{ [<storeTitle>get[text]] }}}><$list filter="[<searchTiddler>get[text]!match<userInput>]" emptyMessage="""<$action-deletetiddler $filter="[<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]"/>"""><$action-setfield $tiddler=<<searchTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text="yes"/></$list></$set>
|
||||||
\end
|
\end
|
||||||
|
|
||||||
\define cancel-search-actions() <$list filter="[<storeTitle>!has[text]] +[<searchTiddler>!has[text]]" emptyMessage="""<<cancel-search-actions-inner>>"""><$action-sendmessage $message="tm-edit-text-operation" $param="wrap-selection" prefix="" suffix=""/></$list>
|
\define cancel-search-actions() <$list filter="[<storeTitle>!has[text]] +[<searchTiddler>!has[text]]" emptyMessage="""<<cancel-search-actions-inner>>"""><$action-sendmessage $message="tm-edit-text-operation" $param="focus-editor"/></$list>
|
||||||
|
|
||||||
\define external-link()
|
\define external-link()
|
||||||
<$button class="tc-btn-invisible" style="width: auto; display: inline-block; background-colour: inherit;" actions=<<add-link-actions>>>
|
<$button class="tc-btn-invisible" style="width: auto; display: inline-block; background-colour: inherit;" actions=<<add-link-actions>>>
|
||||||
|
|||||||
@@ -8,11 +8,11 @@ condition: [<targetTiddler>]
|
|||||||
button-classes: tc-text-editor-toolbar-item-start-group
|
button-classes: tc-text-editor-toolbar-item-start-group
|
||||||
shortcuts: ((preview))
|
shortcuts: ((preview))
|
||||||
|
|
||||||
<$reveal state="$:/state/showeditpreview" type="match" text="yes" tag="span">
|
<$reveal state=<<edit-preview-state>> type="match" text="yes" tag="span">
|
||||||
{{$:/core/images/preview-open}}
|
{{$:/core/images/preview-open}}
|
||||||
<$action-setfield $tiddler="$:/state/showeditpreview" $value="no"/>
|
<$action-setfield $tiddler=<<edit-preview-state>> $value="no"/>
|
||||||
</$reveal>
|
</$reveal>
|
||||||
<$reveal state="$:/state/showeditpreview" type="nomatch" text="yes" tag="span">
|
<$reveal state=<<edit-preview-state>> type="nomatch" text="yes" tag="span">
|
||||||
{{$:/core/images/preview-closed}}
|
{{$:/core/images/preview-closed}}
|
||||||
<$action-setfield $tiddler="$:/state/showeditpreview" $value="yes"/>
|
<$action-setfield $tiddler=<<edit-preview-state>> $value="yes"/>
|
||||||
</$reveal>
|
</$reveal>
|
||||||
|
|||||||
53
core/ui/EditorToolbar/stamp-dropdown-item-template.tid
Normal file
53
core/ui/EditorToolbar/stamp-dropdown-item-template.tid
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
title: $:/core/ui/EditorToolbar/StampDropdown/ItemTemplate
|
||||||
|
|
||||||
|
<$linkcatcher actions="""
|
||||||
|
|
||||||
|
<$list filter="[<modifier>!match[ctrl]]" variable="ignore">
|
||||||
|
|
||||||
|
<$list filter="[<currentTiddler>addsuffix[/prefix]!is[tiddler]!is[shadow]removesuffix[/prefix]addsuffix[/suffix]!is[tiddler]!is[shadow]]" variable="ignore">
|
||||||
|
|
||||||
|
<$action-sendmessage
|
||||||
|
$message="tm-edit-text-operation"
|
||||||
|
$param="replace-selection"
|
||||||
|
text={{{ [<currentTiddler>get[text]] }}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
</$list>
|
||||||
|
|
||||||
|
|
||||||
|
<$list filter="[<currentTiddler>addsuffix[/prefix]] [<currentTiddler>addsuffix[/suffix]] +[is[shadow]] :else[is[tiddler]] +[limit[1]]" variable="ignore">
|
||||||
|
|
||||||
|
<$action-sendmessage
|
||||||
|
$message="tm-edit-text-operation"
|
||||||
|
$param="wrap-selection"
|
||||||
|
prefix={{{ [<currentTiddler>addsuffix[/prefix]get[text]] }}}
|
||||||
|
suffix={{{ [<currentTiddler>addsuffix[/suffix]get[text]] }}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
</$list>
|
||||||
|
|
||||||
|
</$list>
|
||||||
|
|
||||||
|
<$list filter="[<modifier>match[ctrl]]" variable="ignore">
|
||||||
|
|
||||||
|
<$action-sendmessage $message="tm-edit-tiddler"/>
|
||||||
|
|
||||||
|
</$list>
|
||||||
|
|
||||||
|
<$action-deletetiddler
|
||||||
|
$tiddler=<<dropdown-state>>
|
||||||
|
/>
|
||||||
|
|
||||||
|
""">
|
||||||
|
|
||||||
|
<$link tooltip={{{ [<currentTiddler>get[description]] }}}>
|
||||||
|
|
||||||
|
<$transclude tiddler=<<currentTiddler>> field="caption" mode="inline">
|
||||||
|
|
||||||
|
<$view tiddler=<<currentTiddler>> field="title" />
|
||||||
|
|
||||||
|
</$transclude>
|
||||||
|
|
||||||
|
</$link>
|
||||||
|
|
||||||
|
</$linkcatcher>
|
||||||
@@ -1,48 +1,6 @@
|
|||||||
title: $:/core/ui/EditorToolbar/stamp-dropdown
|
title: $:/core/ui/EditorToolbar/stamp-dropdown
|
||||||
|
|
||||||
\define toolbar-button-stamp-inner()
|
<$macrocall $name="list-tagged-draggable" tag="$:/tags/TextEditor/Snippet" subFilter="!is[draft]" itemTemplate="$:/core/ui/EditorToolbar/StampDropdown/ItemTemplate"/>
|
||||||
<$button tag="a">
|
|
||||||
|
|
||||||
<$list filter="[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]]">
|
|
||||||
|
|
||||||
<$action-sendmessage
|
|
||||||
$message="tm-edit-text-operation"
|
|
||||||
$param="replace-selection"
|
|
||||||
text={{$(snippetTitle)$}}
|
|
||||||
/>
|
|
||||||
|
|
||||||
</$list>
|
|
||||||
|
|
||||||
|
|
||||||
<$list filter="[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]]">
|
|
||||||
|
|
||||||
<$action-sendmessage
|
|
||||||
$message="tm-edit-text-operation"
|
|
||||||
$param="wrap-selection"
|
|
||||||
prefix={{{ [[$(snippetTitle)$]addsuffix[/prefix]get[text]] }}}
|
|
||||||
suffix={{{ [[$(snippetTitle)$]addsuffix[/suffix]get[text]] }}}
|
|
||||||
/>
|
|
||||||
|
|
||||||
</$list>
|
|
||||||
|
|
||||||
<$action-deletetiddler
|
|
||||||
$tiddler=<<dropdown-state>>
|
|
||||||
/>
|
|
||||||
|
|
||||||
<$transclude tiddler=<<snippetTitle>> field="caption" mode="inline">
|
|
||||||
|
|
||||||
<$view tiddler=<<snippetTitle>> field="title" />
|
|
||||||
|
|
||||||
</$transclude>
|
|
||||||
|
|
||||||
</$button>
|
|
||||||
\end
|
|
||||||
|
|
||||||
<$list filter="[all[shadows+tiddlers]tag[$:/tags/TextEditor/Snippet]!has[draft.of]sort[caption]]" variable="snippetTitle">
|
|
||||||
|
|
||||||
<<toolbar-button-stamp-inner>>
|
|
||||||
|
|
||||||
</$list>
|
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|||||||
@@ -6,4 +6,5 @@ description: {{$:/language/Buttons/Stamp/Hint}}
|
|||||||
condition: [<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]
|
condition: [<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]
|
||||||
shortcuts: ((stamp))
|
shortcuts: ((stamp))
|
||||||
dropdown: $:/core/ui/EditorToolbar/stamp-dropdown
|
dropdown: $:/core/ui/EditorToolbar/stamp-dropdown
|
||||||
|
button-classes: tc-editortoolbar-stamp-button
|
||||||
text:
|
text:
|
||||||
|
|||||||
22
core/ui/ExportTiddlyWikiCore.tid
Normal file
22
core/ui/ExportTiddlyWikiCore.tid
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
title: $:/core/ui/ExportTiddlyWikiCore
|
||||||
|
|
||||||
|
\define jsFileName() tiddlywikicore-$(version)$.js
|
||||||
|
\define noExportMsg()
|
||||||
|
It appears that you have a wiki with an external ~TiddlyWiki core. The export action cannot be performed.
|
||||||
|
<p>You will need to view the page source in your browser. Then go to the very bottom the the source, find the last `<script>`
|
||||||
|
element, and right-click its `src` URI. Save the link as ''$(jsFileName)$''</p>
|
||||||
|
\end
|
||||||
|
|
||||||
|
''For advanced users''
|
||||||
|
|
||||||
|
Export the ~TiddlyWiki core ~JavaScript code for running with external ~JavaScript:
|
||||||
|
|
||||||
|
<$button tooltip="Export the ~TiddlyWiki core code for running with external ~JavaScript" aria-label="export TiddlyWiki core" class="tc-btn-big-green">
|
||||||
|
<$list filter="[[$:/boot/boot.js]is[missing]]" variable="ignore" emptyMessage="""<$action-sendmessage $message="tm-download-file" $param="$:/core/templates/tiddlywiki5.js" filename=<<jsFileName>>/>""" >
|
||||||
|
<$action-setfield $tiddler=<<qualify "$:/temp/alert">> text=<<noExportMsg>> subtitle="Export ~TiddllyWiki Core"/>
|
||||||
|
<$action-sendmessage $message="tm-modal" $param=<<qualify "$:/temp/alert">>/>
|
||||||
|
</$list>
|
||||||
|
{{$:/core/images/download-button}} Download ~TiddlyWiki core
|
||||||
|
</$button>
|
||||||
|
|
||||||
|
[[Further information|https://tiddlywiki.com/#Using%20the%20external%20JavaScript%20template]]
|
||||||
14
core/ui/ListTaggedCascade.tid
Normal file
14
core/ui/ListTaggedCascade.tid
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
title: $:/snippets/ListTaggedCascade
|
||||||
|
|
||||||
|
{{||$:/language/ControlPanel/Cascades/TagPrompt}}
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<$list filter="[all[shadows+tiddlers]tag<currentTiddler>]">
|
||||||
|
<li>
|
||||||
|
<div>
|
||||||
|
<$link><$text text=<<currentTiddler>>/></$link>
|
||||||
|
</div>
|
||||||
|
<$codeblock code={{!!text}}/>
|
||||||
|
</li>
|
||||||
|
</$list>
|
||||||
|
</ol>
|
||||||
@@ -1,9 +1,5 @@
|
|||||||
title: $:/core/ui/Buttons/export-tiddlywikicore
|
title: $:/core/ui/ExportTiddlyWikiCore
|
||||||
tags: $:/tags/PageControls
|
|
||||||
caption: {{$:/core/images/star-filled}} {{$:/language/Buttons/ExportTiddlyWikiCore/Caption}}
|
|
||||||
description: {{$:/language/Buttons/ExportTiddlyWikiCore/Hint}}
|
|
||||||
|
|
||||||
\whitespace trim
|
|
||||||
\define jsFileName() tiddlywikicore-$(version)$.js
|
\define jsFileName() tiddlywikicore-$(version)$.js
|
||||||
\define noExportMsg()
|
\define noExportMsg()
|
||||||
It appears that you have a wiki with an external ~TiddlyWiki core. The export action cannot be performed.
|
It appears that you have a wiki with an external ~TiddlyWiki core. The export action cannot be performed.
|
||||||
@@ -11,15 +7,16 @@ It appears that you have a wiki with an external ~TiddlyWiki core. The export ac
|
|||||||
element, and right-click its `src` URI. Save the link as ''$(jsFileName)$''</p>
|
element, and right-click its `src` URI. Save the link as ''$(jsFileName)$''</p>
|
||||||
\end
|
\end
|
||||||
|
|
||||||
<$button tooltip={{$:/language/Buttons/ExportTiddlyWikiCore/Hint}} aria-label={{$:/language/Buttons/ExportTiddlyWikiCore/Caption}} class=<<tv-config-toolbar-class>>>
|
''For advanced users''
|
||||||
|
|
||||||
|
Export the ~TiddlyWiki core ~JavaScript code for running with external ~JavaScript:
|
||||||
|
|
||||||
|
<$button tooltip="Export the ~TiddlyWiki core code for running with external ~JavaScript" aria-label="export TiddlyWiki core" class="tc-btn-big-green">
|
||||||
<$list filter="[[$:/boot/boot.js]is[missing]]" variable="ignore" emptyMessage="""<$action-sendmessage $message="tm-download-file" $param="$:/core/templates/tiddlywiki5.js" filename=<<jsFileName>>/>""" >
|
<$list filter="[[$:/boot/boot.js]is[missing]]" variable="ignore" emptyMessage="""<$action-sendmessage $message="tm-download-file" $param="$:/core/templates/tiddlywiki5.js" filename=<<jsFileName>>/>""" >
|
||||||
<$action-setfield $tiddler=<<qualify "$:/temp/alert">> text=<<noExportMsg>> subtitle="Export ~TiddllyWiki Core"/>
|
<$action-setfield $tiddler=<<qualify "$:/temp/alert">> text=<<noExportMsg>> subtitle="Export ~TiddllyWiki Core"/>
|
||||||
<$action-sendmessage $message="tm-modal" $param=<<qualify "$:/temp/alert">>/>
|
<$action-sendmessage $message="tm-modal" $param=<<qualify "$:/temp/alert">>/>
|
||||||
</$list>
|
</$list>
|
||||||
<$list filter="[<tv-config-toolbar-icons>match[yes]]" variable="listItem">
|
{{$:/core/images/download-button}} Download ~TiddlyWiki core
|
||||||
{{$:/core/images/star-filled}}
|
|
||||||
</$list>
|
|
||||||
<$list filter="[<tv-config-toolbar-text>match[yes]]">
|
|
||||||
<span class="tc-btn-text"><$text text={{$:/language/Buttons/ExportTiddlyWikiCore/Caption}}/></span>
|
|
||||||
</$list>
|
|
||||||
</$button>
|
</$button>
|
||||||
|
|
||||||
|
[[Further information|https://tiddlywiki.com/#Using%20the%20external%20JavaScript%20template]]
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ tags: $:/tags/PageTemplate
|
|||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<$list filter="[list[$:/StoryList]]" history="$:/HistoryList" template={{$:/config/ui/ViewTemplate}} editTemplate={{$:/config/ui/EditTemplate}} storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>
|
<$list filter="[list[$:/StoryList]]" history="$:/HistoryList" template="$:/core/ui/StoryTiddlerTemplate" storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>
|
||||||
|
|
||||||
<section class="story-frontdrop">
|
<section class="story-frontdrop">
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,15 @@
|
|||||||
title: $:/core/ui/PluginListItemTemplate
|
title: $:/core/ui/PluginListItemTemplate
|
||||||
|
|
||||||
<div class="tc-menu-list-item">
|
\whitespace trim
|
||||||
<$link to={{!!title}}><$view field="description"><$view field="title"/></$view></$link>
|
<$link to={{!!title}} class="tc-plugin-info">
|
||||||
</div>
|
<div class="tc-plugin-info-chunk tc-plugin-info-icon">
|
||||||
|
<$transclude tiddler=<<currentTiddler>> subtiddler={{{ [<currentTiddler>addsuffix[/icon]] }}}>
|
||||||
|
<$transclude tiddler={{{ [<currentTiddler>get[plugin-type]addprefix[$:/core/images/plugin-generic-]] }}}/>
|
||||||
|
</$transclude>
|
||||||
|
</div>
|
||||||
|
<div class="tc-plugin-info-chunk tc-plugin-info-description">
|
||||||
|
<h1>
|
||||||
|
''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$view field="description"><$view field="title"/></$view>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</$link>
|
||||||
|
|||||||
3
core/ui/StoryTiddlerTemplate.tid
Normal file
3
core/ui/StoryTiddlerTemplate.tid
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
title: $:/core/ui/StoryTiddlerTemplate
|
||||||
|
|
||||||
|
<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/StoryTiddlerTemplateFilter]!is[draft]get[text]] :and[!is[blank]else{$:/config/ui/ViewTemplate}] }}} />
|
||||||
@@ -13,10 +13,10 @@ title: $:/core/ui/TagPickerTagTemplate
|
|||||||
<$action-setfield $tiddler=<<refreshTitle>> text="yes"/>
|
<$action-setfield $tiddler=<<refreshTitle>> text="yes"/>
|
||||||
</$list>
|
</$list>
|
||||||
<<actions>>
|
<<actions>>
|
||||||
<$set name="backgroundColor" value={{!!color}}>
|
<$set name="backgroundColor" value={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}>
|
||||||
<$wikify name="foregroundColor" text="""<$macrocall $name="contrastcolour" target={{!!color}} fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>>/>""">
|
<$wikify name="foregroundColor" text="""<$macrocall $name="contrastcolour" target=<<backgroundColor>> fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>>/>""">
|
||||||
<span class="tc-tag-label tc-btn-invisible" style=<<tag-pill-styles>>>
|
<span class="tc-tag-label tc-btn-invisible" style=<<tag-pill-styles>>>
|
||||||
<$transclude tiddler={{!!icon}}/><$view field="title" format="text"/>
|
{{||$:/core/ui/TiddlerIcon}}<$view field="title" format="text"/>
|
||||||
</span>
|
</span>
|
||||||
</$wikify>
|
</$wikify>
|
||||||
</$set>
|
</$set>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ title: $:/core/ui/TagTemplate
|
|||||||
\whitespace trim
|
\whitespace trim
|
||||||
<span class="tc-tag-list-item" data-tag-title=<<currentTiddler>>>
|
<span class="tc-tag-list-item" data-tag-title=<<currentTiddler>>>
|
||||||
<$set name="transclusion" value=<<currentTiddler>>>
|
<$set name="transclusion" value=<<currentTiddler>>>
|
||||||
<$macrocall $name="tag-pill-body" tag=<<currentTiddler>> icon={{!!icon}} colour={{!!color}} palette={{$:/palette}} element-tag="""$button""" element-attributes="""popup=<<qualify "$:/state/popup/tag">> dragFilter='[all[current]tagging[]]' tag='span'"""/>
|
<$macrocall $name="tag-pill-body" tag=<<currentTiddler>> icon={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}} colour={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}} palette={{$:/palette}} element-tag="""$button""" element-attributes="""popup=<<qualify "$:/state/popup/tag">> dragFilter='[all[current]tagging[]]' tag='span'"""/>
|
||||||
<$reveal state=<<qualify "$:/state/popup/tag">> type="popup" position="below" animate="yes" class="tc-drop-down">
|
<$reveal state=<<qualify "$:/state/popup/tag">> type="popup" position="below" animate="yes" class="tc-drop-down">
|
||||||
<$set name="tv-show-missing-links" value="yes">
|
<$set name="tv-show-missing-links" value="yes">
|
||||||
<$transclude tiddler="$:/core/ui/ListItemTemplate"/>
|
<$transclude tiddler="$:/core/ui/ListItemTemplate"/>
|
||||||
|
|||||||
8
core/ui/TiddlerIcon.tid
Normal file
8
core/ui/TiddlerIcon.tid
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
title: $:/core/ui/TiddlerIcon
|
||||||
|
|
||||||
|
\whitespace trim
|
||||||
|
<$let tiddlerIcon={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerIconFilter]!is[draft]get[text]] }}}>
|
||||||
|
<$list filter="[<tiddlerIcon>!is[blank]]" variable="ignore">
|
||||||
|
<$transclude tiddler=<<tiddlerIcon>>/>
|
||||||
|
</$list>
|
||||||
|
</$let>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user