1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2026-01-25 12:23:42 +00:00

Compare commits

..

7 Commits

Author SHA1 Message Date
jeremy@jermolene.com
162e4be9f2 Docs updates 2022-05-23 09:21:12 +01:00
jeremy@jermolene.com
1ef9d11ca3 Merge branch 'master' into json-ops 2022-05-23 09:16:44 +01:00
jeremy@jermolene.com
28f1d587b6 Rename JSON operators
See https://github.com/Jermolene/TiddlyWiki5/pull/6522#issuecomment-1111206619
2022-04-27 17:35:45 +01:00
jeremy@jermolene.com
096b30f43b WIP 2022-04-27 17:28:02 +01:00
jeremy@jermolene.com
1d4418a777 Merge branch 'master' into json-ops 2022-04-27 17:27:43 +01:00
jeremy@jermolene.com
093cda65fb Merge branch 'master' into json-ops 2022-04-06 17:37:21 +01:00
jeremy@jermolene.com
5f4dc2a5fe Initial Commit 2022-03-11 10:25:16 +00:00
397 changed files with 20777 additions and 4021 deletions

1
.gitignore vendored
View File

@@ -1,6 +1,5 @@
.DS_Store .DS_Store
.c9/ .c9/
.vscode/
tmp/ tmp/
output/ output/
node_modules/ node_modules/

View File

@@ -1230,16 +1230,13 @@ $tw.Wiki = function(options) {
this.getTiddler = function(title) { this.getTiddler = function(title) {
if(title) { if(title) {
var t = tiddlers[title]; var t = tiddlers[title];
if(t !== undefined) { if(t instanceof $tw.Tiddler) {
return t; return t;
} else { } else if(title !== undefined && shadowTiddlers[title]) {
var s = shadowTiddlers[title]; return shadowTiddlers[title].tiddler;
if(s !== undefined) {
return s.tiddler;
}
} }
return undefined;
} }
return undefined;
}; };
// Get an array of all tiddler titles // Get an array of all tiddler titles
@@ -2419,7 +2416,7 @@ $tw.boot.initStartup = function(options) {
$tw.utils.registerFileType("application/epub+zip","base64",".epub"); $tw.utils.registerFileType("application/epub+zip","base64",".epub");
$tw.utils.registerFileType("application/octet-stream","base64",".octet-stream"); $tw.utils.registerFileType("application/octet-stream","base64",".octet-stream");
// Create the wiki store for the app // Create the wiki store for the app
$tw.wiki = new $tw.Wiki($tw.safeMode && {enableIndexers: []}); $tw.wiki = new $tw.Wiki();
// Install built in tiddler fields modules // Install built in tiddler fields modules
$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap("tiddlerfield"); $tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap("tiddlerfield");
// Install the tiddler deserializer modules // Install the tiddler deserializer modules

File diff suppressed because one or more lines are too long

View File

@@ -18,8 +18,6 @@ CopyToClipboard/Caption: copy to clipboard
CopyToClipboard/Hint: Copy this text to the clipboard CopyToClipboard/Hint: Copy this text to the clipboard
Delete/Caption: delete Delete/Caption: delete
Delete/Hint: Delete this tiddler Delete/Hint: Delete this tiddler
DeleteTiddlers/Caption: delete tiddlers
DeleteTiddlers/Hint: Delete tiddlers
Edit/Caption: edit Edit/Caption: edit
Edit/Hint: Edit this tiddler Edit/Hint: Edit this tiddler
Encryption/Caption: encryption Encryption/Caption: encryption

View File

@@ -1,6 +1,5 @@
title: $:/language/EditTemplate/ title: $:/language/EditTemplate/
Caption: Editor
Body/External/Hint: This tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself Body/External/Hint: This tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself
Body/Placeholder: Type the text for this tiddler Body/Placeholder: Type the text for this tiddler
Body/Preview/Type/Output: output Body/Preview/Type/Output: output

View File

@@ -13,7 +13,7 @@ dependents: For a plugin, lists the dependent plugin titles
description: The descriptive text for a plugin, or a modal dialogue description: The descriptive text for a plugin, or a modal dialogue
draft.of: For draft tiddlers, contains the title of the tiddler of which this is a draft draft.of: For draft tiddlers, contains the title of the tiddler of which this is a draft
draft.title: For draft tiddlers, contains the proposed new title of the tiddler draft.title: For draft tiddlers, contains the proposed new title of the tiddler
footer: The footer text for a modal footer: The footer text for a wizard
hide-body: The view template will hide bodies of tiddlers if set to ''yes'' hide-body: The view template will hide bodies of tiddlers if set to ''yes''
icon: The title of the tiddler containing the icon associated with a tiddler icon: The title of the tiddler containing the icon associated with a tiddler
library: Indicates that a tiddler should be saved as a JavaScript library if set to ''yes'' library: Indicates that a tiddler should be saved as a JavaScript library if set to ''yes''
@@ -28,7 +28,7 @@ plugin-type: The type of plugin in a plugin tiddler
revision: The revision of the tiddler held at the server revision: The revision of the tiddler held at the server
released: Date of a TiddlyWiki release released: Date of a TiddlyWiki release
source: The source URL associated with a tiddler source: The source URL associated with a tiddler
subtitle: The subtitle text for a modal subtitle: The subtitle text for a wizard
tags: A list of tags associated with a tiddler tags: A list of tags associated with a tiddler
text: The body text of a tiddler text: The body text of a tiddler
throttle.refresh: If present, throttles refreshes of this tiddler throttle.refresh: If present, throttles refreshes of this tiddler

View File

@@ -9,10 +9,9 @@ Before you start storing important information in ~TiddlyWiki it is vital to mak
<div class="tc-control-panel"> <div class="tc-control-panel">
|tc-table-no-border tc-first-col-min-width tc-first-link-nowrap|k |<$link to="$:/SiteTitle"><<lingo Title/Prompt>></$link> |<$edit-text tiddler="$:/SiteTitle" default="" tag="input"/> |
| <$link to="$:/SiteTitle"><<lingo Title/Prompt>></$link>|<$edit-text tiddler="$:/SiteTitle" default="" tag="input"/> | |<$link to="$:/SiteSubtitle"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler="$:/SiteSubtitle" default="" tag="input"/> |
| <$link to="$:/SiteSubtitle"><<lingo Subtitle/Prompt>></$link>|<$edit-text tiddler="$:/SiteSubtitle" default="" tag="input"/> | |<$link to="$:/DefaultTiddlers"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag="textarea" tiddler="$:/DefaultTiddlers"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |
|^ <$link to="$:/DefaultTiddlers"><<lingo DefaultTiddlers/Prompt>></$link><br><<lingo DefaultTiddlers/TopHint>>|<$edit tag="textarea" tiddler="$:/DefaultTiddlers"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |
</div> </div>
See the [[control panel|$:/ControlPanel]] for more options. See the [[control panel|$:/ControlPanel]] for more options.

View File

@@ -31,5 +31,5 @@ Notes:
Examples: Examples:
* `--render '[!is[system]]' '[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]'` -- renders all non-system tiddlers as files in the subdirectory "tiddlers" with URL-encoded titles and the extension HTML * `--render "[!is[system]]" "[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]"` -- renders all non-system tiddlers as files in the subdirectory "tiddlers" with URL-encoded titles and the extension HTML
* `--render '.' 'tiddlers.json' 'text/plain' '$:/core/templates/exporters/JsonFile' 'exportFilter' '[tag[HelloThere]]'` -- renders the tiddlers tagged "HelloThere" to a JSON file named "tiddlers.json"

View File

@@ -8,7 +8,6 @@ CloseAll/Button: close all
ColourPicker/Recent: Recent: ColourPicker/Recent: Recent:
ConfirmCancelTiddler: Do you wish to discard changes to the tiddler "<$text text=<<title>>/>"? ConfirmCancelTiddler: Do you wish to discard changes to the tiddler "<$text text=<<title>>/>"?
ConfirmDeleteTiddler: Do you wish to delete the tiddler "<$text text=<<title>>/>"? ConfirmDeleteTiddler: Do you wish to delete the tiddler "<$text text=<<title>>/>"?
ConfirmDeleteTiddlers: Are you sure you wish to delete <<resultCount>> tiddler(s)?
ConfirmOverwriteTiddler: Do you wish to overwrite the tiddler "<$text text=<<title>>/>"? ConfirmOverwriteTiddler: Do you wish to overwrite the tiddler "<$text text=<<title>>/>"?
ConfirmEditShadowTiddler: You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit "<$text text=<<title>>/>"? ConfirmEditShadowTiddler: You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit "<$text text=<<title>>/>"?
ConfirmAction: Do you wish to proceed? ConfirmAction: Do you wish to proceed?

View File

@@ -1,6 +1,5 @@
title: $:/language/SideBar/ title: $:/language/SideBar/
Caption: Sidebar
All/Caption: All All/Caption: All
Contents/Caption: Contents Contents/Caption: Contents
Drafts/Caption: Drafts Drafts/Caption: Drafts

View File

@@ -50,7 +50,7 @@ Render individual tiddlers and save the results to the specified files
console.log("Rendering \"" + title + "\" to \"" + filepath + "\""); console.log("Rendering \"" + title + "\" to \"" + filepath + "\"");
} }
var parser = wiki.parseTiddler(template || title), var parser = wiki.parseTiddler(template || title),
widgetNode = wiki.makeWidget(parser,{variables: $tw.utils.extend({},variables,{currentTiddler: title,storyTiddler: title})}), widgetNode = wiki.makeWidget(parser,{variables: $tw.utils.extend({},variables,{currentTiddler: title})}),
container = $tw.fakeDocument.createElement("div"); container = $tw.fakeDocument.createElement("div");
widgetNode.render(container,null); widgetNode.render(container,null);
var text = type === "text/html" ? container.innerHTML : container.textContent; var text = type === "text/html" ? container.innerHTML : container.textContent;

View File

@@ -40,7 +40,6 @@ Command.prototype.execute = function() {
$tw.utils.createFileDirectories(filename); $tw.utils.createFileDirectories(filename);
if(template) { if(template) {
variables.currentTiddler = title; variables.currentTiddler = title;
variables.storyTiddler = title;
title = template; title = template;
} }
if(name && value) { if(name && value) {

View File

@@ -46,7 +46,7 @@ Command.prototype.execute = function() {
} }
$tw.utils.each(tiddlers,function(title) { $tw.utils.each(tiddlers,function(title) {
var parser = wiki.parseTiddler(template), var parser = wiki.parseTiddler(template),
widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title, storyTiddler: title}}), widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}}),
container = $tw.fakeDocument.createElement("div"); container = $tw.fakeDocument.createElement("div");
widgetNode.render(container,null); widgetNode.render(container,null);
var text = type === "text/html" ? container.innerHTML : container.textContent, var text = type === "text/html" ? container.innerHTML : container.textContent,

View File

@@ -35,7 +35,7 @@ function FramedEngine(options) {
this.iframeDoc = this.iframeNode.contentWindow.document; this.iframeDoc = this.iframeNode.contentWindow.document;
// (Firefox requires us to put some empty content in the iframe) // (Firefox requires us to put some empty content in the iframe)
var paletteTitle = this.widget.wiki.getTiddlerText("$:/palette"); var paletteTitle = this.widget.wiki.getTiddlerText("$:/palette");
var colorScheme = (this.widget.wiki.getTiddler(paletteTitle) || {fields: {}}).fields["color-scheme"] || "light"; var colorScheme = this.widget.wiki.getTiddler(paletteTitle).fields["color-scheme"] || "light";
this.iframeDoc.open(); this.iframeDoc.open();
this.iframeDoc.write("<meta name='color-scheme' content='" + colorScheme + "'>"); this.iframeDoc.write("<meta name='color-scheme' content='" + colorScheme + "'>");
this.iframeDoc.close(); this.iframeDoc.close();
@@ -87,7 +87,7 @@ function FramedEngine(options) {
$tw.utils.addEventListeners(this.domNode,[ $tw.utils.addEventListeners(this.domNode,[
{name: "click",handlerObject: this,handlerMethod: "handleClickEvent"}, {name: "click",handlerObject: this,handlerMethod: "handleClickEvent"},
{name: "input",handlerObject: this,handlerMethod: "handleInputEvent"}, {name: "input",handlerObject: this,handlerMethod: "handleInputEvent"},
{name: "keydown",handlerObject: this,handlerMethod: "handleKeydownEvent"}, {name: "keydown",handlerObject: this.widget,handlerMethod: "handleKeydownEvent"},
{name: "focus",handlerObject: this,handlerMethod: "handleFocusEvent"} {name: "focus",handlerObject: this,handlerMethod: "handleFocusEvent"}
]); ]);
// Add drag and drop event listeners if fileDrop is enabled // Add drag and drop event listeners if fileDrop is enabled
@@ -192,17 +192,6 @@ FramedEngine.prototype.handleFocusEvent = function(event) {
} }
}; };
/*
Handle a keydown event
*/
FramedEngine.prototype.handleKeydownEvent = function(event) {
if ($tw.keyboardManager.handleKeydownEvent(event, {onlyPriority: true})) {
return true;
}
return this.widget.handleKeydownEvent(event);
};
/* /*
Handle a click Handle a click
*/ */

View File

@@ -115,7 +115,7 @@ function editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {
// Otherwise, we need to construct a default value for the editor // Otherwise, we need to construct a default value for the editor
switch(this.editField) { switch(this.editField) {
case "text": case "text":
value = ""; value = "Type the text for the tiddler '" + this.editTitle + "'";
type = "text/vnd.tiddlywiki"; type = "text/vnd.tiddlywiki";
break; break;
case "title": case "title":

View File

@@ -16,9 +16,7 @@ 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, index = 0;
suffixes = options.suffixes,
flatten = (suffixes[0] && suffixes[0][0] === "flat") ? true : false;
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]),{
@@ -38,13 +36,7 @@ exports.map = function(operationSubFunction,options) {
} }
} }
}); });
if(filtered.length && flatten) { results.push(filtered[0] || "");
$tw.utils.each(filtered,function(value) {
results.push(value);
})
} else {
results.push(filtered[0]||"");
}
++index; ++index;
}); });
} }

View File

@@ -12,9 +12,6 @@ Adds tiddler filtering methods to the $tw.Wiki object.
/*global $tw: false */ /*global $tw: false */
"use strict"; "use strict";
/* Maximum permitted filter recursion depth */
var MAX_FILTER_DEPTH = 300;
/* /*
Parses an operation (i.e. a run) within a filter string Parses an operation (i.e. a run) within a filter string
operators: Array of array of operator nodes into which results should be inserted operators: Array of array of operator nodes into which results should be inserted
@@ -223,18 +220,10 @@ source: an iterator function for the source tiddlers, called source(iterator), w
widget: an optional widget node for retrieving the current tiddler etc. widget: an optional widget node for retrieving the current tiddler etc.
*/ */
exports.compileFilter = function(filterString) { exports.compileFilter = function(filterString) {
if(!this.filterCache) {
this.filterCache = Object.create(null);
this.filterCacheCount = 0;
}
if(this.filterCache[filterString] !== undefined) {
return this.filterCache[filterString];
}
var filterParseTree; var filterParseTree;
try { try {
filterParseTree = this.parseFilter(filterString); filterParseTree = this.parseFilter(filterString);
} catch(e) { } catch(e) {
// We do not cache this result, so it adjusts along with localization changes
return function(source,widget) { return function(source,widget) {
return [$tw.language.getString("Error/Filter") + ": " + e]; return [$tw.language.getString("Error/Filter") + ": " + e];
}; };
@@ -331,7 +320,7 @@ exports.compileFilter = function(filterString) {
})()); })());
}); });
// Return a function that applies the operations to a source iterator of tiddler titles // Return a function that applies the operations to a source iterator of tiddler titles
var fnMeasured = $tw.perf.measure("filter: " + filterString,function filterFunction(source,widget) { return $tw.perf.measure("filter: " + filterString,function filterFunction(source,widget) {
if(!source) { if(!source) {
source = self.each; source = self.each;
} else if(typeof source === "object") { // Array or hashmap } else if(typeof source === "object") { // Array or hashmap
@@ -341,27 +330,11 @@ exports.compileFilter = function(filterString) {
widget = $tw.rootWidget; widget = $tw.rootWidget;
} }
var results = new $tw.utils.LinkedList(); var results = new $tw.utils.LinkedList();
self.filterRecursionCount = (self.filterRecursionCount || 0) + 1; $tw.utils.each(operationFunctions,function(operationFunction) {
if(self.filterRecursionCount < MAX_FILTER_DEPTH) { operationFunction(results,source,widget);
$tw.utils.each(operationFunctions,function(operationFunction) { });
operationFunction(results,source,widget);
});
} else {
results.push("/**-- Excessive filter recursion --**/");
}
self.filterRecursionCount = self.filterRecursionCount - 1;
return results.toArray(); return results.toArray();
}); });
if(this.filterCacheCount >= 2000) {
// To prevent memory leak, we maintain an upper limit for cache size.
// Reset if exceeded. This should give us 95% of the benefit
// that no cache limit would give us.
this.filterCache = Object.create(null);
this.filterCacheCount = 0;
}
this.filterCache[filterString] = fnMeasured;
this.filterCacheCount++;
return fnMeasured;
}; };
})(); })();

View File

@@ -1,35 +0,0 @@
/*\
title: $:/core/modules/filters/format/json.js
type: application/javascript
module-type: formatfilteroperator
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Export our filter function
*/
exports.json = function(source,operand,options) {
var results = [],
spaces = null;
if(operand) {
spaces = /^\d+$/.test(operand) ? parseInt(operand,10) : operand;
}
source(function(tiddler,title) {
var data = $tw.utils.parseJSONSafe(title);
try {
data = JSON.parse(title);
} catch(e) {
data = undefined;
}
if(data !== undefined) {
results.push(JSON.stringify(data,null,spaces));
}
});
return results;
};
})();

View File

@@ -1,46 +0,0 @@
/*\
title: $:/core/modules/filters/insertafter.js
type: application/javascript
module-type: filteroperator
Insert an item after another item in a list
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
Order a list
*/
exports.insertafter = function(source,operator,options) {
var results = [];
source(function(tiddler,title) {
results.push(title);
});
var target = operator.operands[1] || (options.widget && options.widget.getVariable(operator.suffix || "currentTiddler"));
if(target !== operator.operand) {
// Remove the entry from the list if it is present
var pos = results.indexOf(operator.operand);
if(pos !== -1) {
results.splice(pos,1);
}
// Insert the entry after the target marker
pos = results.indexOf(target);
if(pos !== -1) {
results.splice(pos+1,0,operator.operand);
} else {
var suffix = operator.operands.length > 1 ? operator.suffix : "";
if(suffix === "start") {
results.splice(0,0,operator.operand);
} else {
results.push(operator.operand);
}
}
}
return results;
};
})();

View File

@@ -32,12 +32,7 @@ exports.insertbefore = function(source,operator,options) {
if(pos !== -1) { if(pos !== -1) {
results.splice(pos,0,operator.operand); results.splice(pos,0,operator.operand);
} else { } else {
var suffix = operator.operands.length > 1 ? operator.suffix : ""; results.push(operator.operand);
if(suffix == "start") {
results.splice(0,0,operator.operand);
} else {
results.push(operator.operand);
}
} }
} }
return results; return results;

View File

@@ -19,13 +19,13 @@ exports.variable = function(source,prefix,options) {
var results = []; var results = [];
if(prefix === "!") { if(prefix === "!") {
source(function(tiddler,title) { source(function(tiddler,title) {
if(options.widget.getVariable(title) === undefined) { if(!(title in options.widget.variables)) {
results.push(title); results.push(title);
} }
}); });
} else { } else {
source(function(tiddler,title) { source(function(tiddler,title) {
if(options.widget.getVariable(title) !== undefined) { if(title in options.widget.variables) {
results.push(title); results.push(title);
} }
}); });

View File

@@ -15,11 +15,11 @@ Filter operators for JSON operations
exports["jsonget"] = function(source,operator,options) { exports["jsonget"] = function(source,operator,options) {
var results = []; var results = [];
source(function(tiddler,title) { source(function(tiddler,title) {
var data = $tw.utils.parseJSONSafe(title,title); var data = options.wiki.getTiddlerDataCached(title);
if(data) { if(data) {
var item = getDataItemValueAsString(data,operator.operands); var item = getDataItemValueAsStrings(data,operator.operands);
if(item !== undefined) { if(item !== undefined) {
results.push(item); results.push.apply(results,item);
} }
} }
}); });
@@ -29,7 +29,7 @@ exports["jsonget"] = function(source,operator,options) {
exports["jsonindexes"] = function(source,operator,options) { exports["jsonindexes"] = function(source,operator,options) {
var results = []; var results = [];
source(function(tiddler,title) { source(function(tiddler,title) {
var data = $tw.utils.parseJSONSafe(title,title); var data = options.wiki.getTiddlerDataCached(title);
if(data) { if(data) {
var item = getDataItemKeysAsStrings(data,operator.operands); var item = getDataItemKeysAsStrings(data,operator.operands);
if(item !== undefined) { if(item !== undefined) {
@@ -43,7 +43,7 @@ exports["jsonindexes"] = function(source,operator,options) {
exports["jsontype"] = function(source,operator,options) { exports["jsontype"] = function(source,operator,options) {
var results = []; var results = [];
source(function(tiddler,title) { source(function(tiddler,title) {
var data = $tw.utils.parseJSONSafe(title,title); var data = options.wiki.getTiddlerDataCached(title);
if(data) { if(data) {
var item = getDataItemType(data,operator.operands); var item = getDataItemType(data,operator.operands);
if(item !== undefined) { if(item !== undefined) {
@@ -57,11 +57,11 @@ exports["jsontype"] = function(source,operator,options) {
/* /*
Given a JSON data structure and an array of index strings, return an array of the string representation of the values at the end of the index chain, or "undefined" if any of the index strings are invalid Given a JSON data structure and an array of index strings, return an array of the string representation of the values at the end of the index chain, or "undefined" if any of the index strings are invalid
*/ */
function getDataItemValueAsString(data,indexes) { function getDataItemValueAsStrings(data,indexes) {
// Get the item // Get the item
var item = getDataItem(data,indexes); var item = getDataItem(data,indexes);
// Return the item as a string // Return the item as a string
return convertDataItemValueToString(item); return convertDataItemValueToStrings(item);
} }
/* /*
@@ -77,15 +77,29 @@ function getDataItemKeysAsStrings(data,indexes) {
/* /*
Return an array of the string representation of the values of a data item, or "undefined" if the item is undefined Return an array of the string representation of the values of a data item, or "undefined" if the item is undefined
*/ */
function convertDataItemValueToString(item) { function convertDataItemValueToStrings(item) {
// Return the item as a string // Return the item as a string
if(item === undefined) { if(item === undefined) {
return item; return item;
} }
if(typeof item === "object") { if(typeof item === "object") {
return JSON.stringify(item); if(item === null) {
return ["null"];
}
var results = [];
if($tw.utils.isArray(item)) {
$tw.utils.each(item,function(value) {
results.push.apply(results,convertDataItemValueToStrings(value));
});
return results;
} else {
$tw.utils.each(Object.keys(item).sort(),function(key) {
results.push.apply(results,convertDataItemValueToStrings(item[key]));
});
return results;
}
} }
return item.toString(); return [item.toString()];
} }
/* /*

View File

@@ -16,15 +16,9 @@ Filter operator for returning the names of the active variables
Export our filter function Export our filter function
*/ */
exports.variables = function(source,operator,options) { exports.variables = function(source,operator,options) {
var names = [], var names = [];
widget = options.widget; for(var variable in options.widget.variables) {
while(widget && !widget.hasOwnProperty("variables")) { names.push(variable);
widget = widget.parentWidget;
}
if(widget && widget.variables) {
for(var variable in widget.variables) {
names.push(variable);
}
} }
return names.sort(); return names.sort();
}; };

View File

@@ -141,7 +141,6 @@ function KeyboardManager(options) {
this.shortcutKeysList = [], // Stores the shortcut-key descriptors this.shortcutKeysList = [], // Stores the shortcut-key descriptors
this.shortcutActionList = [], // Stores the corresponding action strings this.shortcutActionList = [], // Stores the corresponding action strings
this.shortcutParsedList = []; // Stores the parsed key descriptors this.shortcutParsedList = []; // Stores the parsed key descriptors
this.shortcutPriorityList = []; // Stores the parsed shortcut priority
this.lookupNames = ["shortcuts"]; this.lookupNames = ["shortcuts"];
this.lookupNames.push($tw.platform.isMac ? "shortcuts-mac" : "shortcuts-not-mac") this.lookupNames.push($tw.platform.isMac ? "shortcuts-mac" : "shortcuts-not-mac")
this.lookupNames.push($tw.platform.isWindows ? "shortcuts-windows" : "shortcuts-not-windows"); this.lookupNames.push($tw.platform.isWindows ? "shortcuts-windows" : "shortcuts-not-windows");
@@ -319,23 +318,12 @@ KeyboardManager.prototype.updateShortcutLists = function(tiddlerList) {
this.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined; this.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined;
this.shortcutActionList[i] = tiddlerFields.text; this.shortcutActionList[i] = tiddlerFields.text;
this.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined; this.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;
this.shortcutPriorityList[i] = tiddlerFields.priority === "yes" ? true : false;
} }
}; };
/* KeyboardManager.prototype.handleKeydownEvent = function(event) {
event: the keyboard event object
options:
onlyPriority: true if only priority global shortcuts should be invoked
*/
KeyboardManager.prototype.handleKeydownEvent = function(event, options) {
options = options || {};
var key, action; var key, action;
for(var i=0; i<this.shortcutTiddlers.length; i++) { for(var i=0; i<this.shortcutTiddlers.length; i++) {
if(options.onlyPriority && this.shortcutPriorityList[i] !== true) {
continue;
}
if(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) { if(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) {
key = this.shortcutParsedList[i]; key = this.shortcutParsedList[i];
action = this.shortcutActionList[i]; action = this.shortcutActionList[i];

View File

@@ -58,7 +58,7 @@ exports.parse = function() {
var reEnd; var reEnd;
if(this.match[3]) { if(this.match[3]) {
// If so, the end of the body is marked with \end // If so, the end of the body is marked with \end
reEnd = new RegExp("(\\r?\\n\\\\end[^\\S\\n\\r]*(?:" + $tw.utils.escapeRegExp(this.match[1]) + ")?(?:$|\\r?\\n))","mg"); reEnd = /(\r?\n\\end[^\S\n\r]*(?:$|\r?\n))/mg;
} else { } else {
// Otherwise, the end of the definition is marked by the end of the line // Otherwise, the end of the definition is marked by the end of the line
reEnd = /($|\r?\n)/mg; reEnd = /($|\r?\n)/mg;

View File

@@ -41,6 +41,9 @@ exports.parse = function() {
var node = { var node = {
type: "element", type: "element",
tag: "span", tag: "span",
attributes: {
"class": {type: "string", value: "tc-inline-style"}
},
children: tree children: tree
}; };
if(classString) { if(classString) {
@@ -49,9 +52,6 @@ exports.parse = function() {
if(stylesString) { if(stylesString) {
$tw.utils.addAttributeToParseTreeNode(node,"style",stylesString); $tw.utils.addAttributeToParseTreeNode(node,"style",stylesString);
} }
if(!classString && !stylesString) {
$tw.utils.addClassToParseTreeNode(node,"tc-inline-style");
}
return [node]; return [node];
}; };

View File

@@ -116,7 +116,7 @@ WikiParser.prototype.loadRemoteTiddler = function(url) {
*/ */
WikiParser.prototype.setupRules = function(proto,configPrefix) { WikiParser.prototype.setupRules = function(proto,configPrefix) {
var self = this; var self = this;
if(!$tw.safeMode) { if(!$tw.safemode) {
$tw.utils.each(proto,function(object,name) { $tw.utils.each(proto,function(object,name) {
if(self.wiki.getTiddlerText(configPrefix + name,"enable") !== "enable") { if(self.wiki.getTiddlerText(configPrefix + name,"enable") !== "enable") {
delete proto[name]; delete proto[name];

View File

@@ -359,9 +359,8 @@ Server.prototype.listen = function(port,host,prefix) {
} }
// Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port) // Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port)
server.on("listening",function() { server.on("listening",function() {
var address = server.address(), var address = server.address();
url = self.protocol + "://" + (address.family === "IPv6" ? "[" + address.address + "]" : address.address) + ":" + address.port + prefix; $tw.utils.log("Serving on " + self.protocol + "://" + address.address + ":" + address.port + prefix,"brown/orange");
$tw.utils.log("Serving on " + url,"brown/orange");
$tw.utils.log("(press ctrl-C to exit)","red"); $tw.utils.log("(press ctrl-C to exit)","red");
}); });
// Listen // Listen

View File

@@ -62,14 +62,12 @@ function loadIFrame(url,callback) {
Unload library iframe for given url Unload library iframe for given url
*/ */
function unloadIFrame(url){ function unloadIFrame(url){
var iframes = document.getElementsByTagName('iframe'); $tw.utils.each(document.getElementsByTagName('iframe'), function(iframe) {
for(var t=iframes.length-1; t--; t>=0) {
var iframe = iframes[t];
if(iframe.getAttribute("library") === "true" && if(iframe.getAttribute("library") === "true" &&
iframe.getAttribute("src") === url) { iframe.getAttribute("src") === url) {
iframe.parentNode.removeChild(iframe); iframe.parentNode.removeChild(iframe);
} }
} });
} }
function saveIFrameInfoTiddler(iframeInfo) { function saveIFrameInfoTiddler(iframeInfo) {

View File

@@ -54,9 +54,7 @@ exports.startup = function() {
var hash = $tw.utils.getLocationHash(); var hash = $tw.utils.getLocationHash();
if(hash !== $tw.locationHash) { if(hash !== $tw.locationHash) {
$tw.locationHash = hash; $tw.locationHash = hash;
if(hash !== "#") { openStartupTiddlers({defaultToCurrentStory: true});
openStartupTiddlers({defaultToCurrentStory: true});
}
} }
},false); },false);
// Listen for the tm-browser-refresh message // Listen for the tm-browser-refresh message

View File

@@ -25,13 +25,14 @@ widget: widget to use as the context for the filter
exports.makeDraggable = function(options) { exports.makeDraggable = function(options) {
var dragImageType = options.dragImageType || "dom", var dragImageType = options.dragImageType || "dom",
dragImage, dragImage,
domNode = options.domNode; domNode = options.domNode,
dragHandle = options.selector && domNode.querySelector(options.selector) || domNode;
// Make the dom node draggable (not necessary for anchor tags) // Make the dom node draggable (not necessary for anchor tags)
if(!options.selector && ((domNode.tagName || "").toLowerCase() !== "a")) { if((domNode.tagName || "").toLowerCase() !== "a") {
domNode.setAttribute("draggable","true"); dragHandle.setAttribute("draggable","true");
} }
// Add event handlers // Add event handlers
$tw.utils.addEventListeners(domNode,[ $tw.utils.addEventListeners(dragHandle,[
{name: "dragstart", handlerFunction: function(event) { {name: "dragstart", handlerFunction: function(event) {
if(event.dataTransfer === undefined) { if(event.dataTransfer === undefined) {
return false; return false;
@@ -40,19 +41,19 @@ exports.makeDraggable = function(options) {
var dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(), var dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),
dragFilter = options.dragFilterFn && options.dragFilterFn(), dragFilter = options.dragFilterFn && options.dragFilterFn(),
titles = dragTiddler ? [dragTiddler] : [], titles = dragTiddler ? [dragTiddler] : [],
startActions = options.startActions, startActions = options.startActions,
variables, variables,
domNodeRect; domNodeRect;
if(dragFilter) { if(dragFilter) {
titles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget)); titles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));
} }
var titleString = $tw.utils.stringifyList(titles); var titleString = $tw.utils.stringifyList(titles);
// Check that we've something to drag // Check that we've something to drag
if(titles.length > 0 && (options.selector && $tw.utils.domMatchesSelector(event.target,options.selector) || event.target === domNode)) { if(titles.length > 0 && event.target === dragHandle) {
// Mark the drag in progress // Mark the drag in progress
$tw.dragInProgress = domNode; $tw.dragInProgress = domNode;
// Set the dragging class on the element being dragged // Set the dragging class on the element being dragged
$tw.utils.addClass(domNode,"tc-dragging"); $tw.utils.addClass(event.target,"tc-dragging");
// Invoke drag-start actions if given // Invoke drag-start actions if given
if(startActions !== undefined) { if(startActions !== undefined) {
// Collect our variables // Collect our variables
@@ -106,22 +107,21 @@ exports.makeDraggable = function(options) {
dataTransfer.setData("text/vnd.tiddler",jsonData); dataTransfer.setData("text/vnd.tiddler",jsonData);
dataTransfer.setData("text/plain",titleString); dataTransfer.setData("text/plain",titleString);
dataTransfer.setData("text/x-moz-url","data:text/vnd.tiddler," + encodeURIComponent(jsonData)); dataTransfer.setData("text/x-moz-url","data:text/vnd.tiddler," + encodeURIComponent(jsonData));
} else {
dataTransfer.setData("URL","data:text/vnd.tiddler," + encodeURIComponent(jsonData));
} }
dataTransfer.setData("URL","data:text/vnd.tiddler," + encodeURIComponent(jsonData));
dataTransfer.setData("Text",titleString); dataTransfer.setData("Text",titleString);
event.stopPropagation(); event.stopPropagation();
} }
return false; return false;
}}, }},
{name: "dragend", handlerFunction: function(event) { {name: "dragend", handlerFunction: function(event) {
if((options.selector && $tw.utils.domMatchesSelector(event.target,options.selector)) || event.target === domNode) { if(event.target === domNode) {
// Collect the tiddlers being dragged // Collect the tiddlers being dragged
var dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(), var dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),
dragFilter = options.dragFilterFn && options.dragFilterFn(), dragFilter = options.dragFilterFn && options.dragFilterFn(),
titles = dragTiddler ? [dragTiddler] : [], titles = dragTiddler ? [dragTiddler] : [],
endActions = options.endActions, endActions = options.endActions,
variables; variables;
if(dragFilter) { if(dragFilter) {
titles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget)); titles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));
} }
@@ -135,7 +135,7 @@ exports.makeDraggable = function(options) {
options.widget.invokeActionString(endActions,options.widget,event,variables); options.widget.invokeActionString(endActions,options.widget,event,variables);
} }
// Remove the dragging class on the element being dragged // Remove the dragging class on the element being dragged
$tw.utils.removeClass(domNode,"tc-dragging"); $tw.utils.removeClass(event.target,"tc-dragging");
// Delete the drag image element // Delete the drag image element
if(dragImage) { if(dragImage) {
dragImage.parentNode.removeChild(dragImage); dragImage.parentNode.removeChild(dragImage);

View File

@@ -36,9 +36,8 @@ Notifier.prototype.display = function(title,options) {
if(!tiddler) { if(!tiddler) {
return; return;
} }
// Add classes and roles // Add classes
$tw.utils.addClass(notification,"tc-notification"); $tw.utils.addClass(notification,"tc-notification");
notification.setAttribute("role","alert");
// Create the variables // Create the variables
var variables = $tw.utils.extend({currentTiddler: title},options.variables); var variables = $tw.utils.extend({currentTiddler: title},options.variables);
// Render the body of the notification // Render the body of the notification

View File

@@ -42,7 +42,7 @@ var TW_TextNode = function(text) {
this.textContent = text + ""; this.textContent = text + "";
}; };
Object.setPrototypeOf(TW_TextNode,TW_Node.prototype); TW_TextNode.prototype = Object.create(TW_Node.prototype);
Object.defineProperty(TW_TextNode.prototype, "nodeType", { Object.defineProperty(TW_TextNode.prototype, "nodeType", {
get: function() { get: function() {
@@ -67,7 +67,7 @@ var TW_Element = function(tag,namespace) {
this.namespaceURI = namespace || "http://www.w3.org/1999/xhtml"; this.namespaceURI = namespace || "http://www.w3.org/1999/xhtml";
}; };
Object.setPrototypeOf(TW_Element,TW_Node.prototype); TW_Element.prototype = Object.create(TW_Node.prototype);
Object.defineProperty(TW_Element.prototype, "style", { Object.defineProperty(TW_Element.prototype, "style", {
get: function() { get: function() {

View File

@@ -48,9 +48,7 @@ Logger.prototype.log = function(/* args */) {
this.saveBufferLogger.buffer = this.saveBufferLogger.buffer.slice(-this.saveBufferLogger.saveLimit); this.saveBufferLogger.buffer = this.saveBufferLogger.buffer.slice(-this.saveBufferLogger.saveLimit);
} }
if(console !== undefined && console.log !== undefined) { if(console !== undefined && console.log !== undefined) {
var logMessage = [$tw.utils.terminalColour(this.colour) + this.componentName + ":"].concat(Array.prototype.slice.call(arguments,0)); return Function.apply.call(console.log, console, [$tw.utils.terminalColour(this.colour),this.componentName + ":"].concat(Array.prototype.slice.call(arguments,0)).concat($tw.utils.terminalColour()));
logMessage[logMessage.length-1] += $tw.utils.terminalColour();
return Function.apply.call(console.log, console, logMessage);
} }
} }
}; };

View File

@@ -12,26 +12,12 @@ Parse tree utility functions.
/*global $tw: false */ /*global $tw: false */
"use strict"; "use strict";
/*
Add attribute to parse tree node
Can be invoked as (node,name,value) or (node,attr)
*/
exports.addAttributeToParseTreeNode = function(node,name,value) { exports.addAttributeToParseTreeNode = function(node,name,value) {
var attribute = typeof name === "object" ? name : {name: name, type: "string", value: value}; var attribute = {name: name, type: "string", value: value};
name = attribute.name;
node.attributes = node.attributes || {}; node.attributes = node.attributes || {};
node.orderedAttributes = node.orderedAttributes || [];
node.attributes[name] = attribute; node.attributes[name] = attribute;
var foundIndex = -1; if(node.orderedAttributes) {
$tw.utils.each(node.orderedAttributes,function(attr,index) {
if(attr.name === name) {
foundIndex = index;
}
});
if(foundIndex === -1) {
node.orderedAttributes.push(attribute); node.orderedAttributes.push(attribute);
} else {
node.orderedAttributes[foundIndex] = attribute;
} }
}; };
@@ -65,8 +51,10 @@ exports.addClassToParseTreeNode = function(node,classString) {
// If the class attribute does not exist, we must create it first. // If the class attribute does not exist, we must create it first.
attribute = {name: "class", type: "string", value: ""}; attribute = {name: "class", type: "string", value: ""};
node.attributes["class"] = attribute; node.attributes["class"] = attribute;
node.orderedAttributes = node.orderedAttributes || []; if(node.orderedAttributes) {
node.orderedAttributes.push(attribute); // If there are orderedAttributes, we've got to add them there too.
node.orderedAttributes.push(attribute);
}
} }
if(attribute.type === "string") { if(attribute.type === "string") {
if(attribute.value !== "") { if(attribute.value !== "") {
@@ -86,8 +74,10 @@ exports.addStyleToParseTreeNode = function(node,name,value) {
if(!attribute) { if(!attribute) {
attribute = {name: "style", type: "string", value: ""}; attribute = {name: "style", type: "string", value: ""};
node.attributes.style = attribute; node.attributes.style = attribute;
node.orderedAttributes = node.orderedAttributes || []; if(node.orderedAttributes) {
node.orderedAttributes.push(attribute); // If there are orderedAttributes, we've got to add them there too.
node.orderedAttributes.push(attribute);
}
} }
if(attribute.type === "string") { if(attribute.type === "string") {
attribute.value += name + ":" + value + ";"; attribute.value += name + ":" + value + ";";

View File

@@ -36,7 +36,7 @@ Compute the internal state of the widget
*/ */
DeleteFieldWidget.prototype.execute = function() { DeleteFieldWidget.prototype.execute = function() {
this.actionTiddler = this.getAttribute("$tiddler",this.getVariable("currentTiddler")); this.actionTiddler = this.getAttribute("$tiddler",this.getVariable("currentTiddler"));
this.actionField = this.getAttribute("$field",null); this.actionField = this.getAttribute("$field");
}; };
/* /*
@@ -59,7 +59,7 @@ DeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {
tiddler = this.wiki.getTiddler(self.actionTiddler), tiddler = this.wiki.getTiddler(self.actionTiddler),
removeFields = {}, removeFields = {},
hasChanged = false; hasChanged = false;
if((this.actionField !== null) && tiddler) { if(this.actionField && tiddler) {
removeFields[this.actionField] = undefined; removeFields[this.actionField] = undefined;
if(this.actionField in tiddler.fields) { if(this.actionField in tiddler.fields) {
hasChanged = true; hasChanged = true;

View File

@@ -46,8 +46,7 @@ ButtonWidget.prototype.render = function(parent,nextSibling) {
isPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp(); isPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();
if(this.selectedClass) { if(this.selectedClass) {
if((this.set || this.setTitle) && this.setTo && this.isSelected()) { if((this.set || this.setTitle) && this.setTo && this.isSelected()) {
$tw.utils.pushTop(classes, this.selectedClass.split(" ")); $tw.utils.pushTop(classes,this.selectedClass.split(" "));
domNode.setAttribute("aria-checked", "true");
} }
if(isPoppedUp) { if(isPoppedUp) {
$tw.utils.pushTop(classes,this.selectedClass.split(" ")); $tw.utils.pushTop(classes,this.selectedClass.split(" "));
@@ -67,9 +66,6 @@ ButtonWidget.prototype.render = function(parent,nextSibling) {
if(this["aria-label"]) { if(this["aria-label"]) {
domNode.setAttribute("aria-label",this["aria-label"]); domNode.setAttribute("aria-label",this["aria-label"]);
} }
if (this.role) {
domNode.setAttribute("role", this.role);
}
if(this.popup || this.popupTitle) { if(this.popup || this.popupTitle) {
domNode.setAttribute("aria-expanded",isPoppedUp ? "true" : "false"); domNode.setAttribute("aria-expanded",isPoppedUp ? "true" : "false");
} }
@@ -210,7 +206,6 @@ ButtonWidget.prototype.execute = function() {
this.popup = this.getAttribute("popup"); this.popup = this.getAttribute("popup");
this.hover = this.getAttribute("hover"); this.hover = this.getAttribute("hover");
this["aria-label"] = this.getAttribute("aria-label"); this["aria-label"] = this.getAttribute("aria-label");
this.role = this.getAttribute("role");
this.tooltip = this.getAttribute("tooltip"); this.tooltip = this.getAttribute("tooltip");
this.style = this.getAttribute("style"); this.style = this.getAttribute("style");
this["class"] = this.getAttribute("class",""); this["class"] = this.getAttribute("class","");

View File

@@ -66,14 +66,14 @@ CheckboxWidget.prototype.render = function(parent,nextSibling) {
CheckboxWidget.prototype.getValue = function() { CheckboxWidget.prototype.getValue = function() {
var tiddler = this.wiki.getTiddler(this.checkboxTitle); var tiddler = this.wiki.getTiddler(this.checkboxTitle);
if(tiddler || this.checkboxFilter) { if(tiddler || this.checkboxFilter) {
if(tiddler && this.checkboxTag) { if(this.checkboxTag) {
if(this.checkboxInvertTag === "yes") { if(this.checkboxInvertTag === "yes") {
return !tiddler.hasTag(this.checkboxTag); return !tiddler.hasTag(this.checkboxTag);
} else { } else {
return tiddler.hasTag(this.checkboxTag); return tiddler.hasTag(this.checkboxTag);
} }
} }
if(tiddler && (this.checkboxField || this.checkboxIndex)) { if(this.checkboxField || this.checkboxIndex) {
// Same logic applies to fields and indexes // Same logic applies to fields and indexes
var value; var value;
if(this.checkboxField) { if(this.checkboxField) {
@@ -206,18 +206,11 @@ CheckboxWidget.prototype.handleChangeEvent = function(event) {
} }
// Set the list field (or index) if specified // Set the list field (or index) if specified
if(this.checkboxListField || this.checkboxListIndex) { if(this.checkboxListField || this.checkboxListIndex) {
var fieldContents, listContents, oldPos, newPos; var listContents, oldPos, newPos;
if(this.checkboxListField) { if(this.checkboxListField) {
fieldContents = tiddler ? tiddler.fields[this.checkboxListField] : undefined; listContents = tiddler.getFieldList(this.checkboxListField);
} else { } else {
fieldContents = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxListIndex); listContents = $tw.utils.parseStringArray(this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxListIndex) || "") || [];
}
if($tw.utils.isArray(fieldContents)) {
// Make a copy so we can modify it without changing original that's refrenced elsewhere
listContents = fieldContents.slice(0);
} else {
listContents = $tw.utils.parseStringArray(fieldContents) || [];
// No need to copy since parseStringArray returns a fresh array, not refrenced elsewhere
} }
oldPos = notValue ? listContents.indexOf(notValue) : -1; oldPos = notValue ? listContents.indexOf(notValue) : -1;
newPos = value ? listContents.indexOf(value) : -1; newPos = value ? listContents.indexOf(value) : -1;

View File

@@ -87,32 +87,12 @@ DraggableWidget.prototype.execute = function() {
this.makeChildWidgets(); this.makeChildWidgets();
}; };
DraggableWidget.prototype.updateDomNodeClasses = function() {
var domNodeClasses = this.domNodes[0].className.split(" "),
oldClasses = this.draggableClasses.split(" ");
this.draggableClasses = this.getAttribute("class");
//Remove classes assigned from the old value of class attribute
$tw.utils.each(oldClasses,function(oldClass){
var i = domNodeClasses.indexOf(oldClass);
if(i !== -1) {
domNodeClasses.splice(i,1);
}
});
//Add new classes from updated class attribute.
$tw.utils.pushTop(domNodeClasses,this.draggableClasses);
this.domNodes[0].setAttribute("class",domNodeClasses.join(" "))
}
/* /*
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
*/ */
DraggableWidget.prototype.refresh = function(changedTiddlers) { DraggableWidget.prototype.refresh = function(changedTiddlers) {
var changedAttributes = this.computeAttributes(), var changedAttributes = this.computeAttributes();
changedAttributesCount = $tw.utils.count(changedAttributes); if($tw.utils.count(changedAttributes) > 0) {
if(changedAttributesCount === 1 && changedAttributes["class"]) {
this.updateDomNodeClasses();
} else if(changedAttributesCount > 0) {
this.refreshSelf(); this.refreshSelf();
return true; return true;
} }
@@ -121,4 +101,4 @@ DraggableWidget.prototype.refresh = function(changedTiddlers) {
exports.draggable = DraggableWidget; exports.draggable = DraggableWidget;
})(); })();

View File

@@ -42,22 +42,16 @@ ElementWidget.prototype.render = function(parent,nextSibling) {
this.tag = "h" + headingLevel; this.tag = "h" + headingLevel;
} }
// Select the namespace for the tag // Select the namespace for the tag
var XHTML_NAMESPACE = "http://www.w3.org/1999/xhtml", var tagNamespaces = {
tagNamespaces = {
svg: "http://www.w3.org/2000/svg", svg: "http://www.w3.org/2000/svg",
math: "http://www.w3.org/1998/Math/MathML", math: "http://www.w3.org/1998/Math/MathML",
body: XHTML_NAMESPACE body: "http://www.w3.org/1999/xhtml"
}; };
this.namespace = tagNamespaces[this.tag]; this.namespace = tagNamespaces[this.tag];
if(this.namespace) { if(this.namespace) {
this.setVariable("namespace",this.namespace); this.setVariable("namespace",this.namespace);
} else { } else {
if(this.hasAttribute("xmlns")) { this.namespace = this.getVariable("namespace",{defaultValue: "http://www.w3.org/1999/xhtml"});
this.namespace = this.getAttribute("xmlns");
this.setVariable("namespace",this.namespace);
} else {
this.namespace = this.getVariable("namespace",{defaultValue: XHTML_NAMESPACE});
}
} }
// Invoke the th-rendering-element hook // Invoke the th-rendering-element hook
var parseTreeNodes = $tw.hooks.invokeHook("th-rendering-element",null,this); var parseTreeNodes = $tw.hooks.invokeHook("th-rendering-element",null,this);

View File

@@ -1,63 +0,0 @@
/*\
title: $:/core/modules/widgets/error.js
type: application/javascript
module-type: widget
Error widget
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var Widget = require("$:/core/modules/widgets/widget.js").widget;
var ErrorWidget = function(parseTreeNode,options) {
this.initialise(parseTreeNode,options);
};
/*
Inherit from the base widget class
*/
ErrorWidget.prototype = new Widget();
/*
Render this widget into the DOM
*/
ErrorWidget.prototype.render = function(parent,nextSibling) {
this.parentDomNode = parent;
this.computeAttributes();
this.execute();
var message = this.getAttribute("$message","Unknown error"),
domNode = this.document.createElement("span");
domNode.appendChild(this.document.createTextNode(message));
domNode.className = "tc-error";
parent.insertBefore(domNode,nextSibling);
this.domNodes.push(domNode);
};
/*
Compute the internal state of the widget
*/
ErrorWidget.prototype.execute = function() {
// Nothing to do for a text node
};
/*
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
*/
ErrorWidget.prototype.refresh = function(changedTiddlers) {
var changedAttributes = this.computeAttributes();
if(changedAttributes["$message"]) {
this.refreshSelf();
return true;
} else {
return false;
}
};
exports.error = ErrorWidget;
})();

View File

@@ -1,108 +0,0 @@
/*\
title: $:/core/modules/widgets/genesis.js
type: application/javascript
module-type: widget
Genesis widget for dynamically creating widgets
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var Widget = require("$:/core/modules/widgets/widget.js").widget;
var GenesisWidget = function(parseTreeNode,options) {
this.initialise(parseTreeNode,options);
};
/*
Inherit from the base widget class
*/
GenesisWidget.prototype = new Widget();
/*
Render this widget into the DOM
*/
GenesisWidget.prototype.render = function(parent,nextSibling) {
this.parentDomNode = parent;
this.computeAttributes({filterFn: function(name) {
// Only compute our own attributes which start with a single dollar
return name.charAt(0) === "$" && name.charAt(1) !== "$";
}});
this.execute();
this.renderChildren(parent,nextSibling);
};
/*
Compute the internal state of the widget
*/
GenesisWidget.prototype.execute = function() {
var self = this;
// Collect attributes
this.genesisType = this.getAttribute("$type","element");
this.genesisRemappable = this.getAttribute("$remappable","yes") === "yes";
this.genesisNames = this.getAttribute("$names","");
this.genesisValues = this.getAttribute("$values","");
// Construct parse tree
var isElementWidget = this.genesisType.charAt(0) !== "$",
nodeType = isElementWidget ? "element" : this.genesisType.substr(1),
nodeTag = isElementWidget ? this.genesisType : undefined;
var parseTreeNodes = [{
type: nodeType,
tag: nodeTag,
attributes: {},
orderedAttributes: [],
children: this.parseTreeNode.children || [],
isNotRemappable: !this.genesisRemappable
}];
// Apply explicit attributes
$tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(this.parseTreeNode),function(attribute) {
var name = attribute.name;
if(name.charAt(0) === "$") {
if(name.charAt(1) === "$") {
// Double $$ is changed to a single $
name = name.substr(1);
} else {
// Single dollar is ignored
return;
}
}
$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],$tw.utils.extend({},attribute,{name: name}));
});
// Apply attributes in $names/$values
this.attributeNames = [];
this.attributeValues = [];
if(this.genesisNames && this.genesisValues) {
this.attributeNames = this.wiki.filterTiddlers(self.genesisNames,this);
this.attributeValues = this.wiki.filterTiddlers(self.genesisValues,this);
$tw.utils.each(this.attributeNames,function(varname,index) {
$tw.utils.addAttributeToParseTreeNode(parseTreeNodes[0],varname,self.attributeValues[index] || "");
});
}
// Construct the child widgets
this.makeChildWidgets(parseTreeNodes);
};
/*
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
*/
GenesisWidget.prototype.refresh = function(changedTiddlers) {
var changedAttributes = this.computeAttributes(),
filterNames = this.getAttribute("$names",""),
filterValues = this.getAttribute("$values",""),
attributeNames = this.wiki.filterTiddlers(filterNames,this),
attributeValues = this.wiki.filterTiddlers(filterValues,this);
if($tw.utils.count(changedAttributes) > 0 || !$tw.utils.isArrayEqual(this.attributeNames,attributeNames) || !$tw.utils.isArrayEqual(this.attributeValues,attributeValues)) {
this.refreshSelf();
return true;
} else {
return this.refreshChildren(changedTiddlers);
}
};
exports.genesis = GenesisWidget;
})();

View File

@@ -111,9 +111,6 @@ ImageWidget.prototype.render = function(parent,nextSibling) {
if(this.imageAlt) { if(this.imageAlt) {
domNode.setAttribute("alt",this.imageAlt); domNode.setAttribute("alt",this.imageAlt);
} }
if(this.lazyLoading && tag === "img") {
domNode.setAttribute("loading",this.lazyLoading);
}
// Add classes when the image loads or fails // Add classes when the image loads or fails
$tw.utils.addClass(domNode,"tc-image-loading"); $tw.utils.addClass(domNode,"tc-image-loading");
domNode.addEventListener("load",function() { domNode.addEventListener("load",function() {
@@ -140,7 +137,6 @@ ImageWidget.prototype.execute = function() {
this.imageClass = this.getAttribute("class"); this.imageClass = this.getAttribute("class");
this.imageTooltip = this.getAttribute("tooltip"); this.imageTooltip = this.getAttribute("tooltip");
this.imageAlt = this.getAttribute("alt"); this.imageAlt = this.getAttribute("alt");
this.lazyLoading = this.getAttribute("loading");
}; };
/* /*

View File

@@ -39,10 +39,7 @@ Compute the internal state of the widget
ImportVariablesWidget.prototype.execute = function(tiddlerList) { ImportVariablesWidget.prototype.execute = function(tiddlerList) {
var widgetPointer = this; var widgetPointer = this;
// Got to flush all the accumulated variables // Got to flush all the accumulated variables
this.variables = Object.create(null); this.variables = new this.variablesConstructor();
if(this.parentWidget) {
Object.setPrototypeOf(this.variables,this.parentWidget.variables);
}
// Get our parameters // Get our parameters
this.filter = this.getAttribute("filter"); this.filter = this.getAttribute("filter");
// Compute the filter // Compute the filter

View File

@@ -53,10 +53,6 @@ KeyboardWidget.prototype.render = function(parent,nextSibling) {
}; };
KeyboardWidget.prototype.handleChangeEvent = function(event) { KeyboardWidget.prototype.handleChangeEvent = function(event) {
if ($tw.keyboardManager.handleKeydownEvent(event, {onlyPriority: true})) {
return true;
}
var keyInfo = $tw.keyboardManager.getMatchingKeyDescriptor(event,this.keyInfoArray); var keyInfo = $tw.keyboardManager.getMatchingKeyDescriptor(event,this.keyInfoArray);
if(keyInfo) { if(keyInfo) {
var handled = this.invokeActions(this,event); var handled = this.invokeActions(this,event);

View File

@@ -51,9 +51,11 @@ LetWidget.prototype.computeAttributes = function() {
$tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(this.parseTreeNode),function(attribute) { $tw.utils.each($tw.utils.getOrderedAttributesFromParseTreeNode(this.parseTreeNode),function(attribute) {
var value = self.computeAttribute(attribute), var value = self.computeAttribute(attribute),
name = attribute.name; name = attribute.name;
// Now that it's prepped, we're allowed to look this variable up if(name.charAt(0) !== "$") {
// when defining later variables // Now that it's prepped, we're allowed to look this variable up
self.currentValueFor[name] = value; // when defining later variables
self.currentValueFor[name] = value;
}
}); });
// Run through again, setting variables and looking for differences // Run through again, setting variables and looking for differences
$tw.utils.each(this.currentValueFor,function(value,name) { $tw.utils.each(this.currentValueFor,function(value,name) {

View File

@@ -175,11 +175,6 @@ SelectWidget.prototype.refresh = function(changedTiddlers) {
return true; return true;
// If the target tiddler value has changed, just update setting and refresh the children // If the target tiddler value has changed, just update setting and refresh the children
} else { } else {
if(changedAttributes.class) {
this.selectClass = this.getAttribute("class");
this.getSelectDomNode().setAttribute("class",this.selectClass);
}
var childrenRefreshed = this.refreshChildren(changedTiddlers); var childrenRefreshed = this.refreshChildren(changedTiddlers);
if(changedTiddlers[this.selectTitle] || childrenRefreshed) { if(changedTiddlers[this.selectTitle] || childrenRefreshed) {
this.setSelectValue(); this.setSelectValue();

View File

@@ -70,9 +70,11 @@ TranscludeWidget.prototype.execute = function() {
// Check for recursion // Check for recursion
if(parser) { if(parser) {
if(this.parentWidget && this.parentWidget.hasVariable("transclusion",recursionMarker)) { if(this.parentWidget && this.parentWidget.hasVariable("transclusion",recursionMarker)) {
parseTreeNodes = [{type: "error", attributes: { parseTreeNodes = [{type: "element", tag: "span", attributes: {
"$message": {type: "string", value: $tw.language.getString("Error/RecursiveTransclusion")} "class": {type: "string", value: "tc-error"}
}}]; }, children: [
{type: "text", text: $tw.language.getString("Error/RecursiveTransclusion")}
]}];
} }
} }
// Construct the child widgets // Construct the child widgets

View File

@@ -12,9 +12,6 @@ Widget base class
/*global $tw: false */ /*global $tw: false */
"use strict"; "use strict";
/* Maximum permitted depth of the widget tree for recursion detection */
var MAX_WIDGET_TREE_DEPTH = 1000;
/* /*
Create a widget object for a parse tree node Create a widget object for a parse tree node
parseTreeNode: reference to the parse tree node to be rendered parseTreeNode: reference to the parse tree node to be rendered
@@ -41,10 +38,9 @@ Widget.prototype.initialise = function(parseTreeNode,options) {
this.parseTreeNode = parseTreeNode; this.parseTreeNode = parseTreeNode;
this.wiki = options.wiki; this.wiki = options.wiki;
this.parentWidget = options.parentWidget; this.parentWidget = options.parentWidget;
this.variables = Object.create(null); this.variablesConstructor = function() {};
if(this.parentWidget) { this.variablesConstructor.prototype = this.parentWidget ? this.parentWidget.variables : {};
Object.setPrototypeOf(this.variables,this.parentWidget.variables); this.variables = new this.variablesConstructor();
}
this.document = options.document; this.document = options.document;
this.attributes = {}; this.attributes = {};
this.children = []; this.children = [];
@@ -361,20 +357,6 @@ Widget.prototype.assignAttributes = function(domNode,options) {
} }
}; };
/*
Get the number of ancestor widgets for this widget
*/
Widget.prototype.getAncestorCount = function() {
if(this.ancestorCount === undefined) {
if(this.parentWidget) {
this.ancestorCount = this.parentWidget.getAncestorCount() + 1;
} else {
this.ancestorCount = 0;
}
}
return this.ancestorCount;
};
/* /*
Make child widgets correspondng to specified parseTreeNodes Make child widgets correspondng to specified parseTreeNodes
*/ */
@@ -382,29 +364,21 @@ Widget.prototype.makeChildWidgets = function(parseTreeNodes,options) {
options = options || {}; options = options || {};
this.children = []; this.children = [];
var self = this; var self = this;
// Check for too much recursion // Create set variable widgets for each variable
if(this.getAncestorCount() > MAX_WIDGET_TREE_DEPTH) { $tw.utils.each(options.variables,function(value,name) {
this.children.push(this.makeChildWidget({type: "error", attributes: { var setVariableWidget = {
"$message": {type: "string", value: $tw.language.getString("Error/RecursiveTransclusion")} type: "set",
}})); attributes: {
} else { name: {type: "string", value: name},
// Create set variable widgets for each variable value: {type: "string", value: value}
$tw.utils.each(options.variables,function(value,name) { },
var setVariableWidget = { children: parseTreeNodes
type: "set", };
attributes: { parseTreeNodes = [setVariableWidget];
name: {type: "string", value: name}, });
value: {type: "string", value: value} $tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {
}, self.children.push(self.makeChildWidget(childNode));
children: parseTreeNodes });
};
parseTreeNodes = [setVariableWidget];
});
// Create the child widgets
$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {
self.children.push(self.makeChildWidget(childNode));
});
}
}; };
/* /*

View File

@@ -50,7 +50,7 @@ exports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {
if(tr.field) { if(tr.field) {
var tiddler = this.getTiddler(title); var tiddler = this.getTiddler(title);
if(tr.field === "title") { // Special case so we can return the title of a non-existent tiddler if(tr.field === "title") { // Special case so we can return the title of a non-existent tiddler
return title || defaultText; return title;
} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) { } else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {
return tiddler.getFieldString(tr.field); return tiddler.getFieldString(tr.field);
} else { } else {

View File

@@ -34,8 +34,6 @@ external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee external-link-foreground: #0000ee
foreground: #333333 foreground: #333333
highlight-background: #ffff00
highlight-foreground: #000000
message-background: #ecf2ff message-background: #ecf2ff
message-border: #cfd6e6 message-border: #cfd6e6
message-foreground: #547599 message-foreground: #547599

View File

@@ -34,8 +34,6 @@ external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee external-link-foreground: #0000ee
foreground: #333353 foreground: #333353
highlight-background: #ffff00
highlight-foreground: #000000
message-background: #ecf2ff message-background: #ecf2ff
message-border: #cfd6e6 message-border: #cfd6e6
message-foreground: #547599 message-foreground: #547599

View File

@@ -34,8 +34,6 @@ external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee external-link-foreground: #0000ee
foreground: #333333 foreground: #333333
highlight-background: #ffff00
highlight-foreground: #000000
message-background: #ecf2ff message-background: #ecf2ff
message-border: #cfd6e6 message-border: #cfd6e6
message-foreground: #547599 message-foreground: #547599

View File

@@ -34,8 +34,6 @@ external-link-foreground-hover: inherit
external-link-foreground-visited: #00a external-link-foreground-visited: #00a
external-link-foreground: #00e external-link-foreground: #00e
foreground: #000 foreground: #000
highlight-background: #ffff00
highlight-foreground: #000000
message-background: <<colour foreground>> message-background: <<colour foreground>>
message-border: <<colour background>> message-border: <<colour background>>
message-foreground: <<colour background>> message-foreground: <<colour background>>

View File

@@ -34,8 +34,6 @@ external-link-foreground-hover: inherit
external-link-foreground-visited: #00a external-link-foreground-visited: #00a
external-link-foreground: #00e external-link-foreground: #00e
foreground: #fff foreground: #fff
highlight-background: #ffff00
highlight-foreground: #000000
message-background: <<colour foreground>> message-background: <<colour foreground>>
message-border: <<colour background>> message-border: <<colour background>>
message-foreground: <<colour background>> message-foreground: <<colour background>>

View File

@@ -32,8 +32,6 @@ external-link-foreground-hover:
external-link-foreground-visited: #BF5AF2 external-link-foreground-visited: #BF5AF2
external-link-foreground: #32D74B external-link-foreground: #32D74B
foreground: #FFFFFF foreground: #FFFFFF
highlight-background: #ffff78
highlight-foreground: #000000
menubar-background: #464646 menubar-background: #464646
menubar-foreground: #ffffff menubar-foreground: #ffffff
message-background: <<colour background>> message-background: <<colour background>>

View File

@@ -36,8 +36,6 @@ external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee external-link-foreground: #0000ee
foreground: #333333 foreground: #333333
highlight-background: #ffff00
highlight-foreground: #000000
message-background: #ecf2ff message-background: #ecf2ff
message-border: #cfd6e6 message-border: #cfd6e6
message-foreground: #547599 message-foreground: #547599

View File

@@ -40,8 +40,6 @@ external-link-foreground-hover: inherit
external-link-foreground-visited: #313163 external-link-foreground-visited: #313163
external-link-foreground: #555592 external-link-foreground: #555592
foreground: #2D2A23 foreground: #2D2A23
highlight-background: #ffff00
highlight-foreground: #000000
menubar-background: #CDC2A6 menubar-background: #CDC2A6
menubar-foreground: #5A5446 menubar-foreground: #5A5446
message-background: #ECE5CF message-background: #ECE5CF

View File

@@ -41,8 +41,6 @@ external-link-foreground-hover: inherit
external-link-foreground-visited: #d3869b external-link-foreground-visited: #d3869b
external-link-foreground: #8ec07c external-link-foreground: #8ec07c
foreground: #fbf1c7 foreground: #fbf1c7
highlight-background: #ffff79
highlight-foreground: #000000
menubar-background: #504945 menubar-background: #504945
menubar-foreground: <<colour foreground>> menubar-foreground: <<colour foreground>>
message-background: #83a598 message-background: #83a598

View File

@@ -41,8 +41,6 @@ external-link-foreground-hover: inherit
external-link-foreground-visited: #5E81AC external-link-foreground-visited: #5E81AC
external-link-foreground: #8FBCBB external-link-foreground: #8FBCBB
foreground: #d8dee9 foreground: #d8dee9
highlight-background: #ffff78
highlight-foreground: #000000
menubar-background: #2E3440 menubar-background: #2E3440
menubar-foreground: #d8dee9 menubar-foreground: #d8dee9
message-background: #2E3440 message-background: #2E3440

View File

@@ -34,8 +34,6 @@ external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee external-link-foreground: #0000ee
foreground: #333333 foreground: #333333
highlight-background: #ffff00
highlight-foreground: #000000
message-background: #ecf2ff message-background: #ecf2ff
message-border: #cfd6e6 message-border: #cfd6e6
message-foreground: #547599 message-foreground: #547599

View File

@@ -131,8 +131,6 @@ external-link-background-hover: inherit
external-link-background-visited: inherit external-link-background-visited: inherit
external-link-background: inherit external-link-background: inherit
external-link-foreground-hover: inherit external-link-foreground-hover: inherit
highlight-background: #ffff00
highlight-foreground: #000000
message-border: #cfd6e6 message-border: #cfd6e6
modal-border: #999999 modal-border: #999999
select-tag-background: select-tag-background:

View File

@@ -35,8 +35,6 @@ external-link-foreground: #268bd2
external-link-foreground-hover: external-link-foreground-hover:
external-link-foreground-visited: #268bd2 external-link-foreground-visited: #268bd2
foreground: #839496 foreground: #839496
highlight-background: #ffff78
highlight-foreground: #000000
message-background: #002b36 message-background: #002b36
message-border: #586e75 message-border: #586e75
message-foreground: #839496 message-foreground: #839496

View File

@@ -35,8 +35,6 @@ external-link-foreground: #268bd2
external-link-foreground-hover: inherit external-link-foreground-hover: inherit
external-link-foreground-visited: #268bd2 external-link-foreground-visited: #268bd2
foreground: #657b83 foreground: #657b83
highlight-background: #ffff00
highlight-foreground: #000000
message-background: #fdf6e3 message-background: #fdf6e3
message-border: #93a1a1 message-border: #93a1a1
message-foreground: #657b83 message-foreground: #657b83

View File

@@ -34,8 +34,6 @@ external-link-foreground-hover:
external-link-foreground-visited: external-link-foreground-visited:
external-link-foreground: external-link-foreground:
foreground: rgba(0, 0, 0, 0.87) foreground: rgba(0, 0, 0, 0.87)
highlight-background: #ffff00
highlight-foreground: #000000
message-background: <<colour background>> message-background: <<colour background>>
message-border: <<colour very-muted-foreground>> message-border: <<colour very-muted-foreground>>
message-foreground: rgba(0, 0, 0, 0.54) message-foreground: rgba(0, 0, 0, 0.54)

View File

@@ -34,8 +34,6 @@ external-link-foreground-hover:
external-link-foreground-visited: #7c318c external-link-foreground-visited: #7c318c
external-link-foreground: #9e3eb3 external-link-foreground: #9e3eb3
foreground: rgba(255, 255, 255, 0.7) foreground: rgba(255, 255, 255, 0.7)
highlight-background: #ffff78
highlight-foreground: #000000
message-background: <<colour background>> message-background: <<colour background>>
message-border: <<colour very-muted-foreground>> message-border: <<colour very-muted-foreground>>
message-foreground: rgba(255, 255, 255, 0.54) message-foreground: rgba(255, 255, 255, 0.54)

View File

@@ -43,8 +43,6 @@ external-link-foreground: rgb(179, 179, 255)
external-link-foreground-hover: inherit external-link-foreground-hover: inherit
external-link-foreground-visited: rgb(153, 153, 255) external-link-foreground-visited: rgb(153, 153, 255)
foreground: rgb(179, 179, 179) foreground: rgb(179, 179, 179)
highlight-background: #ffff78
highlight-foreground: #000000
message-background: <<colour tag-foreground>> message-background: <<colour tag-foreground>>
message-border: #96ccff message-border: #96ccff
message-foreground: <<colour tag-background>> message-foreground: <<colour tag-background>>

View File

@@ -42,8 +42,6 @@ external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee external-link-foreground: #0000ee
foreground: #333333 foreground: #333333
highlight-background: #ffff00
highlight-foreground: #000000
message-background: #ecf2ff message-background: #ecf2ff
message-border: #cfd6e6 message-border: #cfd6e6
message-foreground: #547599 message-foreground: #547599

View File

@@ -1,7 +1,7 @@
title: $:/core/templates/server/static.sidebar.wikitext title: $:/core/templates/server/static.sidebar.wikitext
\whitespace trim \whitespace trim
<div class="tc-sidebar-scrollable" style="overflow: auto;" role="region" aria-label={{$:/language/SideBar/Caption}}> <div class="tc-sidebar-scrollable" style="overflow: auto;">
<div class="tc-sidebar-header"> <div class="tc-sidebar-header">
<h1 class="tc-site-title"> <h1 class="tc-site-title">
<$transclude tiddler="$:/SiteTitle"/> <$transclude tiddler="$:/SiteTitle"/>

View File

@@ -19,8 +19,8 @@ title: $:/core/templates/server/static.tiddler.html
</head> </head>
<body class="tc-body"> <body class="tc-body">
<$transclude tiddler="$:/core/templates/server/static.sidebar.wikitext" mode="inline"/> <$transclude tiddler="$:/core/templates/server/static.sidebar.wikitext" mode="inline"/>
<section class="tc-story-river" role="main"> <section class="tc-story-river">
<div class="tc-tiddler-frame" role="article"> <div class="tc-tiddler-frame">
<$transclude tiddler="$:/core/templates/server/static.tiddler.wikitext" mode="inline"/> <$transclude tiddler="$:/core/templates/server/static.tiddler.wikitext" mode="inline"/>
</div> </div>
</section> </section>

View File

@@ -18,7 +18,7 @@ tc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$
<$navigator story="$:/StoryList" history="$:/HistoryList"> <$navigator story="$:/StoryList" history="$:/HistoryList">
<$transclude tiddler="$:/core/ui/ViewTemplate/body" mode="block"/> <$transclude mode="block"/>
</$navigator> </$navigator>

View File

@@ -2,5 +2,11 @@ title: $:/core/ui/Actions/new-image
tags: $:/tags/Actions tags: $:/tags/Actions
description: create a new image tiddler description: create a new image tiddler
\define get-type()
image/$(imageType)$
\end
\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$
\whitespace trim \whitespace trim
<$action-sendmessage $message="tm-new-tiddler" type={{{ [{$:/config/NewImageType}addprefix[image/]] }}}/> <$vars imageType={{$:/config/NewImageType}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}}>
<$action-sendmessage $message="tm-new-tiddler" type=<<get-type>> tags=<<get-tags>>/>
</$vars>

View File

@@ -3,7 +3,7 @@ tags: $:/tags/AdvancedSearch/FilterButton
\whitespace trim \whitespace trim
<$reveal state="$:/temp/advancedsearch" type="nomatch" text=""> <$reveal state="$:/temp/advancedsearch" type="nomatch" text="">
<$button tooltip={{$:/language/Buttons/DeleteTiddlers/Hint}} popup=<<qualify "$:/state/filterDeleteDropdown">> class="tc-btn-invisible"> <$button popup=<<qualify "$:/state/filterDeleteDropdown">> class="tc-btn-invisible">
{{$:/core/images/delete-button}} {{$:/core/images/delete-button}}
</$button> </$button>
</$reveal> </$reveal>
@@ -13,13 +13,13 @@ tags: $:/tags/AdvancedSearch/FilterButton
<div class="tc-block-dropdown tc-edit-type-dropdown"> <div class="tc-block-dropdown tc-edit-type-dropdown">
<div class="tc-dropdown-item-plain"> <div class="tc-dropdown-item-plain">
<$set name="resultCount" value="""<$count filter={{$:/temp/advancedsearch}}/>"""> <$set name="resultCount" value="""<$count filter={{$:/temp/advancedsearch}}/>""">
{{$:/language/ConfirmDeleteTiddlers}} Are you sure you wish to delete <<resultCount>> tiddler(s)?
</$set> </$set>
</div> </div>
<div class="tc-dropdown-item-plain"> <div class="tc-dropdown-item-plain">
<$button class="tc-btn"> <$button class="tc-btn">
<$action-deletetiddler $filter={{$:/temp/advancedsearch}}/> <$action-deletetiddler $filter={{$:/temp/advancedsearch}}/>
{{$:/language/Buttons/DeleteTiddlers/Hint}} Delete these tiddlers
</$button> </$button>
</div> </div>
</div> </div>

View File

@@ -23,9 +23,7 @@ title: $:/core/ui/EditTemplate
<div <div
data-tiddler-title=<<currentTiddler>> data-tiddler-title=<<currentTiddler>>
data-tags={{!!tags}} data-tags={{!!tags}}
class={{{ tc-tiddler-frame tc-tiddler-edit-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}} class={{{ tc-tiddler-frame tc-tiddler-edit-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}>
role="region"
aria-label={{$:/language/EditTemplate/Caption}}>
<$fieldmangler> <$fieldmangler>
<$vars <$vars
storyTiddler=<<currentTiddler>> storyTiddler=<<currentTiddler>>

View File

@@ -5,6 +5,6 @@ caption: {{$:/language/EditTemplate/Body/Preview/Type/Output}}
\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]] [all[shadows+tiddlers]tag[$:/tags/Macro/View/Body]!has[draft.of]] \import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]] [all[shadows+tiddlers]tag[$:/tags/Macro/View/Body]!has[draft.of]]
<$set name="tv-tiddler-preview" value="yes"> <$set name="tv-tiddler-preview" value="yes">
<$transclude tiddler={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/ViewTemplateBodyFilter]!is[draft]get[text]] :and[!is[blank]else[$:/core/ui/ViewTemplate/body/default]] }}} /> <$transclude />
</$set> </$set>

View File

@@ -2,7 +2,7 @@ title: $:/core/ui/PageTemplate/story
tags: $:/tags/PageTemplate tags: $:/tags/PageTemplate
\whitespace trim \whitespace trim
<section class="tc-story-river" role="main"> <section class="tc-story-river">
<section class="story-backdrop"> <section class="story-backdrop">

View File

@@ -51,14 +51,12 @@ tags: $:/tags/SideBarSegment
<$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>> <$keyboard key="((input-tab-right))" actions=<<set-next-input-tab>>>
<$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>> <$keyboard key="((input-tab-left))" actions=<<set-next-input-tab "before">>>
<$keyboard key="((advanced-search-sidebar))" actions=<<advanced-search-actions>>> <$keyboard key="((advanced-search-sidebar))" actions=<<advanced-search-actions>>>
<form class="tc-form-inline">
<$macrocall $name="keyboard-driven-input" tiddler=<<editTiddler>> storeTitle=<<searchTiddler>> <$macrocall $name="keyboard-driven-input" tiddler=<<editTiddler>> storeTitle=<<searchTiddler>>
selectionStateTitle=<<searchListState>> refreshTitle="$:/temp/search/refresh" type="search" selectionStateTitle=<<searchListState>> refreshTitle="$:/temp/search/refresh" type="search"
tag="input" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify "$:/state/popup/search-dropdown">> tag="input" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify "$:/state/popup/search-dropdown">>
class="tc-popup-handle" filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>> class="tc-popup-handle" filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>>
inputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups="yes" inputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups="yes"
configTiddlerFilter="[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]"/> configTiddlerFilter="[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]"/>
</form>
</$keyboard> </$keyboard>
</$keyboard> </$keyboard>
</$keyboard> </$keyboard>

View File

@@ -1,7 +1,7 @@
title: $:/core/ui/SideBarSegments/tabs title: $:/core/ui/SideBarSegments/tabs
tags: $:/tags/SideBarSegment tags: $:/tags/SideBarSegment
<div class="tc-sidebar-lists tc-sidebar-tabs" role="region" aria-label={{$:/language/SideBar/Caption}}> <div class="tc-sidebar-lists tc-sidebar-tabs">
<$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]" default={{$:/config/DefaultSidebarTab}} state="$:/state/tab/sidebar" class="tc-sidebar-tabs-main" explicitState="$:/state/tab/sidebar--595412856"/> <$macrocall $name="tabs" tabsList="[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]" default={{$:/config/DefaultSidebarTab}} state="$:/state/tab/sidebar" class="tc-sidebar-tabs-main" explicitState="$:/state/tab/sidebar--595412856"/>

View File

@@ -7,7 +7,7 @@ $:/state/folded/$(currentTiddler)$
\define cancel-delete-tiddler-actions(message) <$action-sendmessage $message="tm-$message$-tiddler"/> \define cancel-delete-tiddler-actions(message) <$action-sendmessage $message="tm-$message$-tiddler"/>
\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]] \import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]
<$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify "$:/state/popup/tiddler-info">>> <$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify "$:/state/popup/tiddler-info">>>
<div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-view-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[shadow]is[tiddler]then[tc-tiddler-overridden-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}} role="article"> <div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-view-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[shadow]is[tiddler]then[tc-tiddler-overridden-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}>
<$list filter="[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]" variable="listItem"> <$list filter="[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]" variable="listItem">
<$transclude tiddler=<<listItem>>/> <$transclude tiddler=<<listItem>>/>
</$list> </$list>

View File

@@ -1,7 +0,0 @@
title: $:/core/ui/ViewTemplate/body/rendered-plain-text
code-body: yes
\whitespace trim
<$wikify name="text" text={{!!text}} type={{!!type}}>
<$codeblock code=<<text>> language="css"/>
</$wikify>

View File

@@ -4,11 +4,7 @@ tags: $:/tags/ViewTemplate
\whitespace trim \whitespace trim
<$reveal type="nomatch" stateTitle=<<folded-state>> text="hide" tag="div" retain="yes" animate="yes"> <$reveal type="nomatch" stateTitle=<<folded-state>> text="hide" tag="div" retain="yes" animate="yes">
<div class="tc-subtitle"> <div class="tc-subtitle">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/ViewTemplate/Subtitle]!has[draft.of]]" variable="subtitleTiddler" counter="indexSubtitleTiddler"> <$link to={{!!modifier}} />
<$list filter="[<indexSubtitleTiddler-first>match[no]]" variable="ignore"> <$view field="modified" format="date" template={{$:/language/Tiddler/DateFormat}}/>
&nbsp;
</$list>
<$transclude tiddler=<<subtitleTiddler>> mode="inline"/>
</$list>
</div> </div>
</$reveal> </$reveal>

View File

@@ -1,4 +0,0 @@
title: $:/core/ui/ViewTemplate/subtitle/modified
tags: $:/tags/ViewTemplate/Subtitle
<$view field="modified" format="date" template={{$:/language/Tiddler/DateFormat}}/>

View File

@@ -1,4 +0,0 @@
title: $:/core/ui/ViewTemplate/subtitle/modifier
tags: $:/tags/ViewTemplate/Subtitle
<$link to={{!!modifier}}/>

View File

@@ -1,6 +1,6 @@
title: $:/config/OfficialPluginLibrary title: $:/config/OfficialPluginLibrary
tags: $:/tags/PluginLibrary tags: $:/tags/PluginLibrary
url: https://tiddlywiki.com/library/v5.2.4/index.html url: https://tiddlywiki.com/library/v5.2.3/index.html
caption: {{$:/language/OfficialPluginLibrary}} caption: {{$:/language/OfficialPluginLibrary}}
{{$:/language/OfficialPluginLibrary/Hint}} {{$:/language/OfficialPluginLibrary/Hint}}

View File

@@ -1,7 +1,6 @@
title: $:/config/ViewTemplateBodyFilters/ title: $:/config/ViewTemplateBodyFilters/
tags: $:/tags/ViewTemplateBodyFilter tags: $:/tags/ViewTemplateBodyFilter
stylesheet: [tag[$:/tags/Stylesheet]then[$:/core/ui/ViewTemplate/body/rendered-plain-text]]
system: [prefix[$:/boot/]] [prefix[$:/config/]] [prefix[$:/core/macros]] [prefix[$:/core/save/]] [prefix[$:/core/templates/]] [prefix[$:/core/ui/]split[/]count[]compare:number:eq[4]] [prefix[$:/info/]] [prefix[$:/language/]] [prefix[$:/languages/]] [prefix[$:/snippets/]] [prefix[$:/state/]] [prefix[$:/status/]] [prefix[$:/info/]] [prefix[$:/temp/]] +[!is[image]limit[1]then[$:/core/ui/ViewTemplate/body/code]] system: [prefix[$:/boot/]] [prefix[$:/config/]] [prefix[$:/core/macros]] [prefix[$:/core/save/]] [prefix[$:/core/templates/]] [prefix[$:/core/ui/]split[/]count[]compare:number:eq[4]] [prefix[$:/info/]] [prefix[$:/language/]] [prefix[$:/languages/]] [prefix[$:/snippets/]] [prefix[$:/state/]] [prefix[$:/status/]] [prefix[$:/info/]] [prefix[$:/temp/]] +[!is[image]limit[1]then[$:/core/ui/ViewTemplate/body/code]]
code-body: [field:code-body[yes]then[$:/core/ui/ViewTemplate/body/code]] code-body: [field:code-body[yes]then[$:/core/ui/ViewTemplate/body/code]]
import: [field:plugin-type[import]then[$:/core/ui/ViewTemplate/body/import]] import: [field:plugin-type[import]then[$:/core/ui/ViewTemplate/body/import]]

View File

@@ -22,12 +22,12 @@ tags: $:/tags/Macro
<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter="+[insertbefore<actionTiddler>,<currentTiddler>]"/> <$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter="+[insertbefore<actionTiddler>,<currentTiddler>]"/>
\end \end
\define list-links-draggable(tiddler,field:"list",emptyMessage,type:"ul",subtype:"li",class:"",itemTemplate) \define list-links-draggable(tiddler,field:"list",type:"ul",subtype:"li",class:"",itemTemplate)
\whitespace trim \whitespace trim
<span class="tc-links-draggable-list"> <span class="tc-links-draggable-list">
<$vars targetTiddler="""$tiddler$""" targetField="""$field$"""> <$vars targetTiddler="""$tiddler$""" targetField="""$field$""">
<$type$ class="$class$"> <$type$ class="$class$">
<$list filter="[list[$tiddler$!!$field$]]" emptyMessage=<<__emptyMessage__>>> <$list filter="[list[$tiddler$!!$field$]]">
<$droppable actions=<<list-links-draggable-drop-actions>> tag="""$subtype$""" enable=<<tv-enable-drag-and-drop>>> <$droppable actions=<<list-links-draggable-drop-actions>> tag="""$subtype$""" enable=<<tv-enable-drag-and-drop>>>
<div class="tc-droppable-placeholder"/> <div class="tc-droppable-placeholder"/>
<div> <div>

View File

@@ -1,10 +1,10 @@
title: $:/core/macros/tabs title: $:/core/macros/tabs
tags: $:/tags/Macro tags: $:/tags/Macro
code-body: yes code_body: yes
\define tabs-button() \define tabs-button()
\whitespace trim \whitespace trim
<$button set=<<tabsState>> setTo=<<currentTab>> default=<<__default__>> selectedClass="tc-tab-selected" tooltip={{!!tooltip}} role="switch"> <$button set=<<tabsState>> setTo=<<currentTab>> default=<<__default__>> selectedClass="tc-tab-selected" tooltip={{!!tooltip}}>
<$tiddler tiddler=<<save-currentTiddler>>> <$tiddler tiddler=<<save-currentTiddler>>>
<$set name="tv-wikilinks" value="no"> <$set name="tv-wikilinks" value="no">
<$transclude tiddler=<<__buttonTemplate__>> mode="inline"> <$transclude tiddler=<<__buttonTemplate__>> mode="inline">
@@ -48,7 +48,7 @@ code-body: yes
\define tabs(tabsList,default,state:"$:/state/tab",class,template,buttonTemplate,retain,actions,explicitState) \define tabs(tabsList,default,state:"$:/state/tab",class,template,buttonTemplate,retain,actions,explicitState)
\whitespace trim \whitespace trim
<$qualify title=<<__state__>> name="qualifiedState"> <$qualify title=<<__state__>> name="qualifiedState">
<$let tabsState={{{ [<__explicitState__>minlength[1]] ~[<qualifiedState>] }}}> <$set name="tabsState" filter={{{ [<__explicitState__>minlength[1]] ~[<qualifiedState>] }}}>
<div class={{{ [[tc-tab-set]addsuffix[ ]addsuffix<__class__>] }}}> <div class={{{ [[tc-tab-set]addsuffix[ ]addsuffix<__class__>] }}}>
<div class={{{ [[tc-tab-buttons]addsuffix[ ]addsuffix<__class__>] }}}> <div class={{{ [[tc-tab-buttons]addsuffix[ ]addsuffix<__class__>] }}}>
<<tabs-tab-list>> <<tabs-tab-list>>
@@ -58,6 +58,6 @@ code-body: yes
<<tabs-tab-body>> <<tabs-tab-body>>
</div> </div>
</div> </div>
</$let> </$set>
</$qualify> </$qualify>
\end \end

View File

@@ -11,7 +11,7 @@ second-search-filter: [tags[]is[system]search:title<userInput>sort[]]
\whitespace trim \whitespace trim
<$set name="tag" value={{{ [<__tiddler__>get[text]] }}}> <$set name="tag" value={{{ [<__tiddler__>get[text]] }}}>
<$list filter="[<saveTiddler>!contains:$tagField$<tag>!match[]]" variable="ignore" emptyMessage="<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter='-[<tag>]'/>"> <$list filter="[<saveTiddler>!contains:$tagField$<tag>!match[]]" variable="ignore" emptyMessage="<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter='-[<tag>]'/>">
<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter="[<tag>trim[]]"/> <$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter="[<tag>]"/>
$actions$ $actions$
</$list> </$list>
</$set> </$set>
@@ -52,7 +52,7 @@ $actions$
</span><$button popup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$reveal state=<<storeTitle>> type="nomatch" text=""><$button class="tc-btn-invisible tc-small-gap tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Tags/ClearInput/Hint}} aria-label={{$:/language/EditTemplate/Tags/ClearInput/Caption}}>{{$:/core/images/close-button}}<<delete-tag-state-tiddlers>></$button></$reveal><span class="tc-add-tag-button tc-small-gap-left"> </span><$button popup=<<qualify "$:/state/popup/tags-auto-complete">> class="tc-btn-invisible tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$reveal state=<<storeTitle>> type="nomatch" text=""><$button class="tc-btn-invisible tc-small-gap tc-btn-dropdown" tooltip={{$:/language/EditTemplate/Tags/ClearInput/Hint}} aria-label={{$:/language/EditTemplate/Tags/ClearInput/Caption}}>{{$:/core/images/close-button}}<<delete-tag-state-tiddlers>></$button></$reveal><span class="tc-add-tag-button tc-small-gap-left">
<$set name="tag" value={{{ [<newTagNameTiddler>get[text]] }}}> <$set name="tag" value={{{ [<newTagNameTiddler>get[text]] }}}>
<$button set=<<newTagNameTiddler>> setTo="" class=""> <$button set=<<newTagNameTiddler>> setTo="" class="">
<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter="[<tag>trim[]]"/> <$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter="[<tag>]"/>
$actions$ $actions$
<$set name="currentTiddlerCSSEscaped" value={{{ [<saveTiddler>escapecss[]] }}}> <$set name="currentTiddlerCSSEscaped" value={{{ [<saveTiddler>escapecss[]] }}}>
<<delete-tag-state-tiddlers>><$action-sendmessage $message="tm-focus-selector" $param=<<get-tagpicker-focus-selector>>/> <<delete-tag-state-tiddlers>><$action-sendmessage $message="tm-focus-selector" $param=<<get-tagpicker-focus-selector>>/>

View File

@@ -16,7 +16,7 @@ color:$(foregroundColor)$;
$element-attributes$ $element-attributes$
class="tc-tag-label tc-btn-invisible" class="tc-tag-label tc-btn-invisible"
style=<<tag-pill-styles>> style=<<tag-pill-styles>>
>$actions$<$transclude tiddler="""$icon$"""/><$view tiddler=<<__tag__>> field="title" format="text" /></$element-tag$> >$actions$<$transclude tiddler="""$icon$"""/><$view tiddler=<<__tag__>> field="title" format="text" />
\end \end
\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions) \define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)

View File

@@ -3,13 +3,11 @@ tags: $:/tags/Macro
\define toc-caption() \define toc-caption()
\whitespace trim \whitespace trim
<span class="tc-toc-caption tc-tiny-gap-left">
<$set name="tv-wikilinks" value="no"> <$set name="tv-wikilinks" value="no">
<$transclude field="caption"> <$transclude field="caption">
<$view field="title"/> <$view field="title"/>
</$transclude> </$transclude>
</$set> </$set>
</span>
\end \end
\define toc-body(tag,sort:"",itemClassFilter,exclude,path) \define toc-body(tag,sort:"",itemClassFilter,exclude,path)
@@ -53,6 +51,7 @@ tags: $:/tags/Macro
{{$:/core/images/down-arrow}} {{$:/core/images/down-arrow}}
</$button> </$button>
</$reveal> </$reveal>
&#32;
<<toc-caption>> <<toc-caption>>
</$link> </$link>
<$reveal type="match" stateTitle=<<toc-state>> text="open"> <$reveal type="match" stateTitle=<<toc-state>> text="open">
@@ -72,12 +71,14 @@ tags: $:/tags/Macro
<$reveal type="nomatch" stateTitle=<<toc-state>> text="open"> <$reveal type="nomatch" stateTitle=<<toc-state>> text="open">
<$button setTitle=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep"> <$button setTitle=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep">
{{$:/core/images/right-arrow}} {{$:/core/images/right-arrow}}
&#32;
<<toc-caption>> <<toc-caption>>
</$button> </$button>
</$reveal> </$reveal>
<$reveal type="match" stateTitle=<<toc-state>> text="open"> <$reveal type="match" stateTitle=<<toc-state>> text="open">
<$button setTitle=<<toc-state>> setTo="close" class="tc-btn-invisible tc-popup-keep"> <$button setTitle=<<toc-state>> setTo="close" class="tc-btn-invisible tc-popup-keep">
{{$:/core/images/down-arrow}} {{$:/core/images/down-arrow}}
&#32;
<<toc-caption>> <<toc-caption>>
</$button> </$button>
</$reveal> </$reveal>
@@ -126,6 +127,7 @@ tags: $:/tags/Macro
</$button> </$button>
</$reveal> </$reveal>
</$list> </$list>
&#32;
<<toc-caption>> <<toc-caption>>
</$link> </$link>
<$reveal type="match" stateTitle=<<toc-state>> text="open"> <$reveal type="match" stateTitle=<<toc-state>> text="open">
@@ -145,12 +147,14 @@ tags: $:/tags/Macro
<$reveal type="nomatch" stateTitle=<<toc-state>> text="open"> <$reveal type="nomatch" stateTitle=<<toc-state>> text="open">
<$button setTitle=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep"> <$button setTitle=<<toc-state>> setTo="open" class="tc-btn-invisible tc-popup-keep">
{{$:/core/images/right-arrow}} {{$:/core/images/right-arrow}}
&#32;
<<toc-caption>> <<toc-caption>>
</$button> </$button>
</$reveal> </$reveal>
<$reveal type="match" stateTitle=<<toc-state>> text="open"> <$reveal type="match" stateTitle=<<toc-state>> text="open">
<$button setTitle=<<toc-state>> setTo="close" class="tc-btn-invisible tc-popup-keep"> <$button setTitle=<<toc-state>> setTo="close" class="tc-btn-invisible tc-popup-keep">
{{$:/core/images/down-arrow}} {{$:/core/images/down-arrow}}
&#32;
<<toc-caption>> <<toc-caption>>
</$button> </$button>
</$reveal> </$reveal>

View File

@@ -23,7 +23,11 @@ title: $:/snippets/peek-stylesheets
<$reveal type="match" state=<<state>> text="yes" tag="div"> <$reveal type="match" state=<<state>> text="yes" tag="div">
<$set name="source" tiddler=<<currentTiddler>>> <$set name="source" tiddler=<<currentTiddler>>>
<$wikify name="styles" text=<<source>>> <$wikify name="styles" text=<<source>>>
<$codeblock code=<<styles>> language="css"/> <pre>
<code>
<$text text=<<styles>>/>
</code>
</pre>
</$wikify> </$wikify>
</$set> </$set>
</$reveal> </$reveal>

View File

@@ -1,3 +1,3 @@
title: $:/tags/ViewTemplateBodyFilter title: $:/tags/ViewTemplateBodyFilter
list: $:/config/ViewTemplateBodyFilters/hide-body $:/config/ViewTemplateBodyFilters/code-body $:/config/ViewTemplateBodyFilters/stylesheet $:/config/ViewTemplateBodyFilters/system $:/config/ViewTemplateBodyFilters/import $:/config/ViewTemplateBodyFilters/plugin $:/config/ViewTemplateBodyFilters/default list: $:/config/ViewTemplateBodyFilters/system $:/config/ViewTemplateBodyFilters/code-body $:/config/ViewTemplateBodyFilters/import $:/config/ViewTemplateBodyFilters/plugin $:/config/ViewTemplateBodyFilters/hide-body $:/config/ViewTemplateBodyFilters/default

View File

@@ -1,2 +0,0 @@
title: $:/tags/ViewTemplate/Subtitle
list: $:/core/ui/ViewTemplate/subtitle/modifier $:/core/ui/ViewTemplate/subtitle/modified

View File

@@ -0,0 +1,33 @@
created: 20160504080001125
modified: 20160504080318928
title: $:/core/ui/TagTemplate
type: text/vnd.tiddlywiki
\define tag-styles()
background-color:$(backgroundColor)$;
fill:$(foregroundColor)$;
color:$(foregroundColor)$;
\end
\define tag-body-inner(colour,fallbackTarget,colourA,colourB)
<$set name="foregroundColor" value=<<contrastcolour target:"""$colour$""" fallbackTarget:"""$fallbackTarget$""" colourA:"""$colourA$""" colourB:"""$colourB$""">>>
<$set name="backgroundColor" value="""$colour$""">
<$button popup=<<qualify "$:/state/popup/tag">> class="tc-btn-invisible tc-tag-label" style=<<tag-styles>>>
<$transclude tiddler={{!!icon}}/> <$view field="fr-title"><$view field="title" format="text" /></$view>
</$button>
<$reveal state=<<qualify "$:/state/popup/tag">> type="popup" position="below" animate="yes"><div class="tc-drop-down"><$transclude tiddler="$:/core/ui/ListItemTemplate"/>
<hr>
<$list filter="[all[current]tagging[]]" template="$:/core/ui/ListItemTemplate"/>
</div>
</$reveal>
</$set>
</$set>
\end
\define tag-body(colour,palette)
<span class="tc-tag-list-item">
<$macrocall $name="tag-body-inner" colour="""$colour$""" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}}/>
</span>
\end
<$macrocall $name="tag-body" colour={{!!color}} palette={{$:/palette}}/>

View File

@@ -117,7 +117,7 @@ C'est un exemple de tiddler. Voir [[Macros Table des matières (Exemples)|Table-
<table class="doc-bad-example"> <table class="doc-bad-example">
<tbody> <tbody>
<tr class="evenRow"> <tr class="evenRow">
<td><span style="font-size:1.5em;">&#9888;</span> Attention&nbsp;:<br> Ne faites pas comme ça !</td> <td><span class="tc-inline-style" style="font-size:1.5em;">&#9888;</span> Attention&nbsp;:<br> Ne faites pas comme ça !</td>
<td> <td>
$eg$ $eg$

View File

@@ -1,113 +0,0 @@
created: 20220830224607117
modified: 20220830224638865
tags: $:/tags/Macro
title: $:/core/macros/list
\define list-links(filter,type:"ul",subtype:"li",class:"",emptyMessage)
\whitespace trim
<$type$ class="$class$">
<$list filter="$filter$" emptyMessage=<<__emptyMessage__>>>
<$subtype$>
<$link to={{!!title}}>
<$let tv-wikilinks="no">
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$let>
</$link>
</$subtype$>
</$list>
</$type$>
\end
\define list-links-draggable-drop-actions()
<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter="+[insertbefore<actionTiddler>,<currentTiddler>]"/>
\end
\define list-links-draggable(tiddler,field:"list",emptyMessage,type:"ul",subtype:"li",class:"",itemTemplate)
\whitespace trim
<span class="tc-links-draggable-list">
<$vars targetTiddler="""$tiddler$""" targetField="""$field$""">
<$type$ class="$class$">
<$list filter="[list[$tiddler$!!$field$]]" emptyMessage=<<__emptyMessage__>>>
<$droppable actions=<<list-links-draggable-drop-actions>> tag="""$subtype$""" enable=<<tv-enable-drag-and-drop>>>
<div class="tc-droppable-placeholder"/>
<div>
<$transclude tiddler="""$itemTemplate$""">
<$link to={{!!title}}>
<$let tv-wikilinks="no">
<$transclude field="caption">
<$view field="title"/>
</$transclude>
</$let>
</$link>
</$transclude>
</div>
</$droppable>
</$list>
<$tiddler tiddler="">
<$droppable actions=<<list-links-draggable-drop-actions>> tag="div" enable=<<tv-enable-drag-and-drop>>>
<div class="tc-droppable-placeholder">
{{$:/core/images/blank}}
</div>
<div style="height:0.5em;"/>
</$droppable>
</$tiddler>
</$type$>
</$vars>
</span>
\end
\define list-tagged-draggable-drop-actions(tag)
\whitespace trim
<!-- Save the current ordering of the tiddlers with this tag -->
<$set name="order" filter="[<__tag__>tagging[]]">
<!-- Remove any list-after or list-before fields from the tiddlers with this tag -->
<$list filter="[<__tag__>tagging[]]">
<$action-deletefield $field="list-before"/>
<$action-deletefield $field="list-after"/>
</$list>
<!-- Save the new order to the Tag Tiddler -->
<$action-listops $tiddler=<<__tag__>> $field="list" $filter="+[enlist<order>] +[insertbefore<actionTiddler>,<currentTiddler>]"/>
<!-- Make sure the newly added item has the right tag -->
<!-- Removing this line makes dragging tags within the dropdown work as intended -->
<!--<$action-listops $tiddler=<<actionTiddler>> $tags=<<__tag__>>/>-->
<!-- Using the following 5 lines as replacement makes dragging titles from outside into the dropdown apply the tag -->
<$list filter="[<actionTiddler>!contains:tags<__tag__>]">
<$fieldmangler tiddler=<<actionTiddler>>>
<$action-sendmessage $message="tm-add-tag" $param=<<__tag__>>/>
</$fieldmangler>
</$list>
</$set>
\end
\define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:"div",storyview:"")
\whitespace trim
<span class="tc-tagged-draggable-list">
<$set name="tag" value=<<__tag__>>>
<$list filter="[<__tag__>tagging[]$subFilter$]" emptyMessage=<<__emptyMessage__>> storyview=<<__storyview__>>>
<$elementTag$ class="tc-menu-list-item">
<$droppable actions="""<$macrocall $name="list-tagged-draggable-drop-actions" tag=<<__tag__>>/>""" enable=<<tv-enable-drag-and-drop>>>
<$elementTag$ class="tc-droppable-placeholder"/>
<$elementTag$>
<$transclude tiddler="""$itemTemplate$""">
<$link to={{!!title}}>
<$view field="fr-title">
<$view field="title"/>
</$view>
</$link>
</$transclude>
</$elementTag$>
</$droppable>
</$elementTag$>
</$list>
<$tiddler tiddler="">
<$droppable actions="""<$macrocall $name="list-tagged-draggable-drop-actions" tag=<<__tag__>>/>""" enable=<<tv-enable-drag-and-drop>>>
<$elementTag$ class="tc-droppable-placeholder"/>
<$elementTag$ style="height:0.5em;">
</$elementTag$>
</$droppable>
</$tiddler>
</$set>
</span>
\end

View File

@@ -1,39 +0,0 @@
created: 20220830190922373
modified: 20220830191056761
tags: $:/tags/Macro
title: $:/core/macros/tag
\define tag-pill-styles()
background-color:$(backgroundColor)$;
fill:$(foregroundColor)$;
color:$(foregroundColor)$;
\end
<!-- This has no whitespace trim to avoid modifying $actions$. Closing tags omitted for brevity. -->
\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)
<$vars
foregroundColor=<<contrastcolour target:"""$colour$""" fallbackTarget:"""$fallbackTarget$""" colourA:"""$colourA$""" colourB:"""$colourB$""">>
backgroundColor="""$colour$"""
><$element-tag$
$element-attributes$
class="tc-tag-label tc-btn-invisible"
style=<<tag-pill-styles>>
>$actions$<$transclude tiddler="""$icon$"""/><$view tiddler=<<__tag__>> field="fr-title" format="text"><$view tiddler=<<__tag__>> field="title" format="text" /></$view></$element-tag$>
\end
\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)
<$macrocall $name="tag-pill-inner" tag=<<__tag__>> icon="""$icon$""" colour="""$colour$""" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} element-tag="""$element-tag$""" element-attributes="""$element-attributes$""" actions="""$actions$"""/>
\end
\define tag-pill(tag,element-tag:"span",element-attributes:"",actions:"")
\whitespace trim
<span class="tc-tag-list-item" data-tag-title=<<__tag__>>>
<$let currentTiddler=<<__tag__>>>
<$macrocall $name="tag-pill-body" tag=<<__tag__>> 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="""$element-tag$""" element-attributes="""$element-attributes$""" actions="""$actions$"""/>
</$let>
</span>
\end
\define tag(tag)
{{$tag$||$:/core/ui/TagTemplate}}
\end

View File

@@ -1,25 +0,0 @@
created: 20220830194301860
modified: 20220830194658750
title: $:/core/ui/TagPickerTagTemplate
\whitespace trim
<$button class=<<button-classes>> tag="a" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>
<$list filter="[<saveTiddler>minlength[1]]">
<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter="[<tag>]"/>
</$list>
<$set name="currentTiddlerCSSEscaped" value={{{ [<saveTiddler>escapecss[]] }}}>
<$action-sendmessage $message="tm-focus-selector" $param=<<get-tagpicker-focus-selector>> preventScroll="true"/>
</$set>
<<delete-tag-state-tiddlers>>
<$list filter="[<refreshTitle>minlength[1]]">
<$action-setfield $tiddler=<<refreshTitle>> text="yes"/>
</$list>
<<actions>>
<$set name="backgroundColor" value={{{ [<currentTiddler>] :cascade[all[shadows+tiddlers]tag[$:/tags/TiddlerColourFilter]!is[draft]get[text]] }}}>
<$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>>>
{{||$:/core/ui/TiddlerIcon}}<$view field="fr-title" format="text"><$view field="title" format="text"/></$view>
</span>
</$wikify>
</$set>
</$button>

View File

@@ -1,8 +0,0 @@
created: 20220504131459155
modified: 20220504131522349
title: $:/DefaultTiddlers
type: text/vnd.tiddlywiki
HelloThere
KaTeX
$:/plugins/tiddlywiki/katex/developer

View File

@@ -0,0 +1,5 @@
title: $:/DefaultTiddlers
HelloThere
KaTeX
ImplementationNotes

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