diff --git a/core/language/en-GB/ControlPanel.multids b/core/language/en-GB/ControlPanel.multids index f89384bdb..e7c0c2aec 100644 --- a/core/language/en-GB/ControlPanel.multids +++ b/core/language/en-GB/ControlPanel.multids @@ -19,6 +19,10 @@ Advanced/Settings/NavigationHistory/Caption: Navigation History Advanced/Settings/NavigationHistory/Hint: Update browser history when navigating to a tiddler: Advanced/Settings/NavigationHistory/No/Description: Do not update history Advanced/Settings/NavigationHistory/Yes/Description: Update history +Advanced/Settings/ToolbarButtons/Caption: Toolbar Buttons +Advanced/Settings/ToolbarButtons/Hint: Default toolbar button appearance: +Advanced/Settings/ToolbarButtons/Text/Description: Include text +Advanced/Settings/ToolbarButtons/Icons/Description: Include icon Advanced/TiddlerFields/Caption: Tiddler Fields Advanced/TiddlerFields/Hint: This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers). Appearance/Caption: Appearance diff --git a/core/modules/filters.js b/core/modules/filters.js index 474928ba7..bc1138990 100644 --- a/core/modules/filters.js +++ b/core/modules/filters.js @@ -33,7 +33,7 @@ function parseFilterOperation(operators,filterString,p) { operator.prefix = filterString.charAt(p++); } // Get the operator name - var nextBracketPos = filterString.substring(p).search(/[\[\{\/]/); + var nextBracketPos = filterString.substring(p).search(/[\[\{<\/]/); if(nextBracketPos === -1) { throw "Missing [ in filter expression"; } @@ -54,24 +54,28 @@ function parseFilterOperation(operators,filterString,p) { p = nextBracketPos + 1; switch (bracket) { - case '{': // Curly brackets - operator.indirect = true; - nextBracketPos = filterString.indexOf('}',p); - break; - case '[': // Square brackets - nextBracketPos = filterString.indexOf(']',p); - break; - case '/': // regexp brackets - var rex = /^((?:[^\\\/]*|\\.)*)\/(?:\(([mygi]+)\))?/g, - rexMatch = rex.exec(filterString.substring(p)); - if(rexMatch) { - operator.regexp = new RegExp(rexMatch[1], rexMatch[2]); - nextBracketPos = p + rex.lastIndex - 1; - } - else { - throw "Unterminated regular expression in filter expression"; - } - break; + case "{": // Curly brackets + operator.indirect = true; + nextBracketPos = filterString.indexOf("}",p); + break; + case "[": // Square brackets + nextBracketPos = filterString.indexOf("]",p); + break; + case "<": // Angle brackets + operator.variable = true; + nextBracketPos = filterString.indexOf(">",p); + break; + case "/": // regexp brackets + var rex = /^((?:[^\\\/]*|\\.)*)\/(?:\(([mygi]+)\))?/g, + rexMatch = rex.exec(filterString.substring(p)); + if(rexMatch) { + operator.regexp = new RegExp(rexMatch[1], rexMatch[2]); + nextBracketPos = p + rex.lastIndex - 1; + } + else { + throw "Unterminated regular expression in filter expression"; + } + break; } if(nextBracketPos === -1) { @@ -193,6 +197,9 @@ exports.compileFilter = function(filterString) { if(operator.indirect) { operand = self.getTextReference(operator.operand,"",currTiddlerTitle); } + if(operator.variable) { + operand = widget.getVariable(operator.operand,""); + } results = operatorFunction(accumulator,{ operator: operator.operator, operand: operand, diff --git a/core/modules/widgets/widget.js b/core/modules/widgets/widget.js index e7e92449d..9424dd6d8 100755 --- a/core/modules/widgets/widget.js +++ b/core/modules/widgets/widget.js @@ -18,11 +18,8 @@ Create a widget object for a parse tree node options: see below Options include: wiki: mandatory reference to wiki associated with this render tree - variables: optional hashmap of context variables (see below) parentWidget: optional reference to a parent renderer node for the context chain document: optional document object to use instead of global document -Context variables include: - currentTiddler: title of the tiddler providing the context */ var Widget = function(parseTreeNode,options) { if(arguments.length > 0) { diff --git a/core/ui/ControlPanel/Advanced/Settings/ToolbarButtons.tid b/core/ui/ControlPanel/Advanced/Settings/ToolbarButtons.tid new file mode 100644 index 000000000..e3f1926f7 --- /dev/null +++ b/core/ui/ControlPanel/Advanced/Settings/ToolbarButtons.tid @@ -0,0 +1,10 @@ +title: $:/core/ui/ControlPanel/Advanced/Settings/ToolbarButtons +tags: $:/tags/ControlPanel/Advanced/Settings +caption: {{$:/language/ControlPanel/Advanced/Settings/ToolbarButtons/Caption}} + +\define lingo-base() $:/language/ControlPanel/Advanced/Settings/ToolbarButtons/ +<> + +<$checkbox tiddler="$:/config/Toolbar/Icons" field="text" checked="yes" unchecked="no" default="yes"> <$link to="$:/config/Toolbar/Icons"><> + +<$checkbox tiddler="$:/config/Toolbar/Text" field="text" checked="yes" unchecked="no" default="no"> <$link to="$:/config/Toolbar/Text"><> diff --git a/core/ui/PageTemplate.tid b/core/ui/PageTemplate.tid index 889286af5..2746db82a 100644 --- a/core/ui/PageTemplate.tid +++ b/core/ui/PageTemplate.tid @@ -6,6 +6,10 @@ tw-page-container tw-page-view-$(themeTitle)$ tw-language-$(languageTitle)$ <$importvariables filter="[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]"> +<$set name="tw-config-toolbar-icons" value={{$:/config/Toolbar/Icons}}> + +<$set name="tw-config-toolbar-text" value={{$:/config/Toolbar/Text}}> + <$set name="themeTitle" value={{$:/view}}> <$set name="currentTiddler" value={{$:/language}}> @@ -40,4 +44,8 @@ tw-page-container tw-page-view-$(themeTitle)$ tw-language-$(languageTitle)$ + + + + diff --git a/core/ui/ViewToolbar/close.tid b/core/ui/ViewToolbar/close.tid index 92a9c163f..ac2468baa 100644 --- a/core/ui/ViewToolbar/close.tid +++ b/core/ui/ViewToolbar/close.tid @@ -1,4 +1,11 @@ title: $:/core/ui/ViewToolbar/close tags: $:/tags/ViewToolbar -<$button message="tw-close-tiddler" title={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class="btn-invisible">{{$:/core/images/close-button}} \ No newline at end of file +<$button message="tw-close-tiddler" title={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class="btn-invisible"> +<$list filter="[prefix[yes]]"> +{{$:/core/images/close-button}} + +<$list filter="[prefix[yes]]"> +<$text text={{$:/language/Buttons/Close/Caption}}/> + + \ No newline at end of file diff --git a/core/wiki/config/ToolbarIcons.tid b/core/wiki/config/ToolbarIcons.tid new file mode 100644 index 000000000..30299ee40 --- /dev/null +++ b/core/wiki/config/ToolbarIcons.tid @@ -0,0 +1,3 @@ +title: $:/config/Toolbar/Icons + +yes \ No newline at end of file diff --git a/core/wiki/config/ToolbarText.tid b/core/wiki/config/ToolbarText.tid new file mode 100644 index 000000000..39a2136a3 --- /dev/null +++ b/core/wiki/config/ToolbarText.tid @@ -0,0 +1,3 @@ +title: $:/config/Toolbar/Text + +no \ No newline at end of file diff --git a/editions/test/tiddlers/tests/test-filters.js b/editions/test/tiddlers/tests/test-filters.js index 347fbe40a..a523fe5fe 100644 --- a/editions/test/tiddlers/tests/test-filters.js +++ b/editions/test/tiddlers/tests/test-filters.js @@ -270,6 +270,25 @@ describe("Filter tests", function() { expect(wiki.filterTiddlers("[modifier{!!modifier}] +[sort[title]]",fakeWidget).join(",")).toBe("$:/TiddlerTwo,a fourth tiddler,one,Tiddler Three"); }); + it("should handle variable operands", function() { + + var widget = require("$:/core/modules/widgets/widget.js"); + // Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers + var rootWidget = new widget.widget({ + type: "widget", + children: [{type: "widget", children: []}] + },{ + wiki: $tw.wiki, + document: $tw.document + }); + rootWidget.makeChildWidgets(); + var anchorWidget = rootWidget.children[0]; + rootWidget.setVariable("myVar","Tidd"); + rootWidget.setVariable("myVar2","JoeBloggs"); + expect(wiki.filterTiddlers("[prefix] +[sort[title]]",anchorWidget).join(",")).toBe("Tiddler Three,TiddlerOne"); + expect(wiki.filterTiddlers("[modifier] +[sort[title]]",anchorWidget).join(",")).toBe("TiddlerOne"); + }); + it("should handle the before and after operators", function() { expect(wiki.filterTiddlers("[list[TiddlerSeventh]after[TiddlerOne]]").join(",")).toBe("Tiddler Three"); expect(wiki.filterTiddlers("[list[TiddlerSeventh]after[a fourth tiddler]]").join(",")).toBe("MissingTiddler"); diff --git a/editions/tw5.com/tiddlers/dev/TiddlerFilter Formal Grammar.tid b/editions/tw5.com/tiddlers/dev/TiddlerFilter Formal Grammar.tid index b2ae39ff7..8f29fc39d 100644 --- a/editions/tw5.com/tiddlers/dev/TiddlerFilter Formal Grammar.tid +++ b/editions/tw5.com/tiddlers/dev/TiddlerFilter Formal Grammar.tid @@ -1,5 +1,5 @@ created: 20140210141217955 -modified: 20140303091312363 +modified: 20140725091312363 tags: dev title: TiddlerFilter Formal Grammar type: text/vnd.tiddlywiki @@ -34,7 +34,7 @@ Whitespace is matched with javascript "\s+", which matches space, tab, carriage ''<opt-operator-suffix>'' ::= ''<string>'' | "" -''<operand>'' ::= "[" ''<search-string>'' "]" | "{" ''<indirect-search-string>'' "}" | ''<regex>'' +''<operand>'' ::= "[" ''<search-string>'' "]" | "{" ''<indirect-search-string>'' "}" | "<" ''<variable-name-string>'' ">" | ''<regex>'' ''<regex>'' ::= "/" ''<string>'' "/" ''<opt-regex-args>'' diff --git a/editions/tw5.com/tiddlers/filters/Introduction to Filters.tid b/editions/tw5.com/tiddlers/filters/Introduction to Filters.tid index 87fa10bd9..7f69f571f 100644 --- a/editions/tw5.com/tiddlers/filters/Introduction to Filters.tid +++ b/editions/tw5.com/tiddlers/filters/Introduction to Filters.tid @@ -1,5 +1,5 @@ created: 20140410101941871 -modified: 20140410103229640 +modified: 20140725103229640 tags: introduction title: Introduction to Filters type: text/vnd.tiddlywiki @@ -67,6 +67,16 @@ If a filter operator is written with curly brackets around the operand then it i [search{$:/temp/search}] ``` +! Variable Operands + +If a filter operator is written with angle brackets around the operand then it is taken to be the name of a variable containing the actual value. For example, this filter selects all tiddlers containing the title of the current tiddler: + +``` +[search] +``` + +(Note that the `currentTiddler` variable is used to track the current tiddler). + ! Regular Expression Operands The "field" filter also accepts [[regular expressions|http://en.wikipedia.org/wiki/Regular_expression]] with the syntax `/regexp/(modifier)`. For example: